يمكن أن ترجع المرن مباراة سلسلة إلى بيسون
-
23-08-2019 - |
سؤال
أنا أكتب برنامج Bison / Flex لتحويل اللاتكس إلى MathML. في الوقت الحالي، تتعامل مع وظائف (أي SQRT، FRAC، إلخ) تعمل مثل هذا، مع رمز مميز لكل وظيفة
\\frac {return FUNC_FRAC;}
ويمرر token functfrac العودة إلى البيسون، والذي يلعب دوره في وصف هذا الفرعية:
function: FUNC_FRAC LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
ولكن هذا يعني أنني بحاجة إلى تحديد وتوفيل عدد غير محدود من الرموز. ما أود القيام به هو شيء مثل هذا، والذي لا يعمل كما هو مكتوب. في فليكس:
\\[A-Za-z]+[0-9]* {return the-matched-string;}
وفي بيسون:
function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
المحلول
يجب أن يرجع المرن قيمة الرمز الممتازة إلى Bison.
يمكنك العثور على Lexeme (السلسلة المتطابقة) في Flex في القيمة:
yytext
وهكذا يمكنك القيام به:
{id} { yylval->strval=strdup(yytext); return(TOK_ID); }
وهكذا دواليك. ال yylval
بنية تتعلق IIRC إلى Union Bison / كل ما تستخدمه لتقييم الماضي من النوع الرمز المميز .. لذلك قد أكون في Bison
%union {
char *strval;
int intval;
node node_val;
}
إرجاع أي شيء آخر غير نوع الرمز المميز سيؤدي إلى كسر Automaton في Bison. يمكن إجراءات Bison الخاصة بك الوصول مثل:
id_production: TOK_ID
{
$<node_val>$ = create_id_node(yylval.strval);
xfree(yylval.strval); // func makes a copy, so we are cool.
}
وما إلى ذلك وهلم جرا. أي شرح أكثر من هذا وسأبدأ في تكرار الوثائق. أشياء للتشاور:
- كتاب التنين (كما هو الحال دائما)
- تطبيق مترجم حديث في ج (عظيم للبدء)
- بيسون مستندات
- مستندات فليكس
حظ سعيد