puede flexionar devolver una cadena partido de bisonte
-
23-08-2019 - |
Pregunta
Estoy escribiendo un programa de bisonte / Flex para convertir látex en MathML. Por el momento, se trata de funciones (es decir, \ sqrt, \ frac, etc.) funciona de esta manera, con una ficha para cada función
\\frac {return FUNC_FRAC;}
y pasa el FUNC_FRAC contador de nuevo a bisontes, que desempeña su parte en la descripción de este subárbol:
function: FUNC_FRAC LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
Pero esto significa que necesito para definir y hacer malabarismos con un número potencialmente ilimitado de fichas. Lo que me gustaría hacer es algo como esto, que no funciona como está escrito. En flexión:
\\[A-Za-z]+[0-9]* {return the-matched-string;}
y en el bisonte:
function: "\frac" LBRACE atom RBRACE LBRACE atom RBRACE {$$ = "<mfrac>" + $3 + $6 + "</mfrac>";}
Solución
Flex debe devolver el valor del token abstracta de bisonte.
Puede encontrar el lexema (la cadena coincidente) en Flex en el valor:
yytext
Y lo que puede hacer:
{id} { yylval->strval=strdup(yytext); return(TOK_ID); }
Y así sucesivamente. La estructura yylval
se refiere a la unión IIRC bisonte / lo que sea que esté utilizando para evaluar más allá del tipo de token-.. así que podría tener en el bisonte
%union {
char *strval;
int intval;
node node_val;
}
Volviendo otra cosa que un tipo de token-romperá el autómata de bisonte. Sus acciones pueden acceder bisonte, tales como:
id_production: TOK_ID
{
$<node_val>$ = create_id_node(yylval.strval);
xfree(yylval.strval); // func makes a copy, so we are cool.
}
Y así sucesivamente. Cualquier más explicación que esto y que probablemente comenzar la repetición de la documentación. Cosas a consultar:
- Dragon libro (como siempre)
- Compilador moderna Implementación en C (ideal para empezar)
- docs bisonte
- docs Flex
Buena suerte