Frage

Ich schreibe ein Bison / Flex-Programm LaTeX in MathML zu konvertieren. Im Moment mit Funktionen zu tun (d \ sqrt, \ frac, etc.) funktioniert so, mit einem Token für jede Funktion

\\frac         {return FUNC_FRAC;}

und gibt das Token FUNC_FRAC zu Bison zurück, die in der Beschreibung dieses Teilbaums seine Rolle spielt:

function: FUNC_FRAC LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}

Das bedeutet aber, dass ich eine potentiell unbegrenzte Anzahl von Token zu definieren und jonglieren. Was ich möchte, ist, etwas zu tun wie diese, die als geschrieben funktioniert nicht. In flex:

\\[A-Za-z]+[0-9]*  {return the-matched-string;}

und in Bison:

function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
War es hilfreich?

Lösung

Flex sollte den abstrakten Tokenwert zu Bison zurück.

Sie finden das Lexem (die Zeichenfolge angepasst) in Flex im Wert:

yytext

Und so können Sie tun:

{id}    { yylval->strval=strdup(yytext); return(TOK_ID); }

Und so weiter. Die yylval Struktur bezieht IIRC auf die Bison Vereinigung / was auch immer Sie vorbei an dem Token-Typ zu bewerten verwenden .. also ich könnte in Bison habe

%union {
    char *strval;
    int intval;
    node node_val;
}

Rückkehr etwas anderes als ein Token-Typ wird der Automat in Bison brechen. Ihr Bison Aktionen können so zugreifen, wie:

id_production: TOK_ID
    { 
        $<node_val>$ = create_id_node(yylval.strval);
        xfree(yylval.strval); // func makes a copy, so we are cool.
    }

Und so weiter. Mehr Erklärung als diese, und ich werde wahrscheinlich beginnen Dokumentation zu wiederholen. Aktivitäten unter:

  1. Dragon Book (wie immer)
  2. Modern Compiler Implementierung in C (ideal für den Einstieg)
  3. Bison docs
  4. Flex docs

Good Luck

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top