Uso de identificador no declarado ‘yylval’
Intenté ejecutar este programa en Lex y Yacc. Trabajo en un Macbook Pro.
No entiendo por qué no se reconoce yylval en el archivo Lex; ¿alguien sabe qué debo hacer aquí? Quizás necesito agregar algunos includes, ¿o algo más? Encontré algo en internet así:
Archivo Lex:
%%
August { yylval = 8; return AUGUST; }
September { yylval = 9; return SEPTEMBER; }
October { yylval = 10; return OCTOBER; }
November { yylval = 11; return NOVEMBER; }
December { yylval = 12; return DECEMBER; }
20[0-9][0-9] { yylval = atoi(yytext); return YEAR; }
. return yytext[0];
%%
Archivo Yacc:
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include “lex.yy.c”
int yylex(void);
int yyerror();
%}
%token AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER
%token YEAR
%%
s: month ‘#’ YEAR
{
printf(“%d %d\n”,$1,$3);
printf(“LA FECHA ES CORRECTA\n”);
}
month : AUGUST {$$ = $1;}
| SEPTEMBER {$$ = $1;}
| OCTOBER {$$ = $1;}
| NOVEMBER {$$ = $1;}
| DECEMBER{$$ = $1;}
%%
int main(){
return yyparse();
}
int yyerror(){
printf(“Error en la fecha\n”);
return 0;
}
cuando ejecuto esto
lex archivo.l
yacc archivo.y
gcc -o archivo y.tab.c -ll
¡este es el error que obtengo!:
En archivo incluido desde test.y:8:
test.l:3:3: error: uso de identificador no declarado ‘yylval’
{ yylval = 8; return AUGUST; }
^
test.l:4:3: error: uso de identificador no declarado ‘yylval’
{ yylval = 9; return SEPTEMBER; }
^
test.l:5:3: error: uso de identificador no declarado ‘yylval’
{ yylval = 10; return OCTOBER; }
^
test.l:6:3: error: uso de identificador no declarado ‘yylval’
{ yylval = 11; return NOVEMBER; }
^
test.l:7:3: error: uso de identificador no declarado ‘yylval’
{ yylval = 12; return DECEMBER; }
^
test.l:8:3: error: uso de identificador no declarado ‘yylval’
{ yylval = atoi(yytext); return YEAR; }
^
6 errores generados.</stdlib.h></string.h></stdio.h>
davy.ai
Parece que el archivo lex no tiene la declaración de
yylval
. Para poder usaryylval
en el archivo lex, necesitas incluir el archivo de encabezadoy.tab.h
generado por yacc.Para hacer esto, puedes agregar
%{}
y%}
alrededor de la inclusión del archivo de encabezado en el archivo yacc, de esta manera:Luego, en la terminal, debes ejecutar los siguientes comandos:
Ten en cuenta que la opción
-d
se utiliza en yacc para generar tantoy.tab.c
como un archivo de encabezadoy.tab.h
que define los valores de los tokens. Además, al compilar congcc
, debes enlazar tantoy.tab.c
comolex.yy.c
.