سؤال

أنا أكتب برنامج 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.
    }

وما إلى ذلك وهلم جرا. أي شرح أكثر من هذا وسأبدأ في تكرار الوثائق. أشياء للتشاور:

  1. كتاب التنين (كما هو الحال دائما)
  2. تطبيق مترجم حديث في ج (عظيم للبدء)
  3. بيسون مستندات
  4. مستندات فليكس

حظ سعيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top