Ésta es C Código pero supongo que será un caso indicativo para C++ también.
Cuando tuvimos que hacer un compilador en la universidad tuvimos que definir el YY_DECL en un archivo .l
así:
#define YY_DECL int alpha_yylex(yylval_) void *yylval_;
El int alpha_yylex(yylval_)
es la función y la void *yylval
es el tipo de parámetro.
Claramente, necesita esto para que el analizador sepa por dónde empezar, también conocido como qué función es la que debe realizar el análisis.
También necesita externar este prototipo de función (extern int alpha_yylex(void *yylval_);
) en su archivo .y
.
Después de eso, las utilidades Flex/Bison generarán automáticamente los archivos relevantes .c
para usted.
En general, .l
es para las reglas léxicas y .y
es para las reglas gramaticales. Por lo tanto, si usted necesita para obtener el valor de algún lugar se debe definir una unión en .y
como esto (un ejemplo):
%union {
union {
int Integer;
double Double;
char Character;
char* String;
} value;
}
Luego, dependiendo de las reglas sintácticas y, lo puede hacer yylval.value.String = strdup(yytext)
en su .l file
y, según sus reglas gramaticales, $$.Double = $1.Double + $3.Double
en su archivo .y
.
No recuerdo mucho, ya que ha pasado un tiempo que yo he hecho eso, pero supongo que se puede tratar y se puede hacer referencia a la documentación o pedir aquí :)
PS: (tenía una buenas preguntas frecuentes en algún lugar, pero no recuerdo dónde diablos está -> publicaré más tarde si tengo la suerte de encontrarlo xD: D xD)
Gracias Ernest ... todavía estoy luchando, pero ojalá llegue allí. En realidad, no tengo un yylex() en mi Lexer - Flex crea uno predeterminado que probablemente haga el getchar(). Creo que necesito escribir el mío en el Lexer o algo así. – ale