Question

J'écris 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 fonction

\\frac         {return FUNC_FRAC;}

et passe le jeton FUNC_FRAC 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 je voudrais faire quelque chose comme ça, qui ne fonctionne pas comme écrit. Flex:

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

et le bison:

function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
Était-ce utile?

La solution

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;
}

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

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. Toute explication plus que cela et je vais probablement commencer à répéter la documentation. Les choses à consulter:

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

Bonne chance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top