2009-07-05 12 views
4

Je suis en train d'écrire un programme Bison/Flex pour convertir LaTeX en MathML. À l'heure actuelle, le traitement des fonctions (par exemple \ sqrt, \ frac, etc) fonctionne comme ceci, avec un jeton pour chaque fonctionpouvez Flex retourner une chaîne de correspondance à bison

\\frac   {return FUNC_FRAC;} 

et passe le FUNC_FRAC jeton de retour au bison, qui joue son rôle dans la description de ce sous-arbre:

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

Mais cela signifie que je dois définir et jongler avec un nombre potentiellement illimité de jetons. Ce que j'aimerais faire, c'est quelque chose comme ça, qui ne fonctionne pas comme écrit. Flex:

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

et bison:

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

Répondre

6

Flex doit retourner la valeur symbolique abstraite Bison.

Vous pouvez trouver le lexème (la chaîne adaptée) dans Flex de la valeur:

yytext 

Et vous pouvez donc faire:

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

Et ainsi de suite. La struct yylval concerne IIRC à l'union de bison/tout ce que vous utilisez pour évaluer les événements passés du type de jeton .. donc je pourrais avoir dans Bison

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

retour autre chose qu'un type de jeton briser l'automate dans Bison . Vos actions Bison peuvent accéder comme:

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

Et ainsi de suite. Plus d'explication que cela et je vais probablement commencer à répéter la documentation. Les choses à consulter:

  1. dragon Livre (comme toujours)
  2. de mise en œuvre du compilateur moderne en C (idéal pour commencer)
  3. Bison docs
  4. Flex docs

Bonne chance

+0

oh garçon. Les trucs yytext. Se souvenir de moi collège –

+2

Je souhaite que je n'ai pas vu la question ... me donne envie de finir les anciens projets;) –

+0

le livre Lex et Yacc a également un exemple de calculatrice simple qui ajoute le support pour les fonctions, et montre comment éviter le code main chaque fonction et construire une table dans le yacc/bison, en utilisant le style TOK_ID ci-dessus, avec le levage lourd fait dans create_id_node –