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>";}
¿Fue útil?

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:

  1. Dragon libro (como siempre)
  2. Compilador moderna Implementación en C (ideal para empezar)
  3. docs bisonte
  4. docs Flex

Buena suerte

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top