El programa LexYacc muestra un error que incluye la declaración implícita de ‘yylex’.
Estoy estudiando compiladores y aprendiendo sobre Lex y Yacc. Escribo un código LexYacc como me muestra mi profesor:
Aquí está exp.l:
“`
/%option outfile=”scanner.cpp”/
%{
/#include “exp.tab.h”/
include “y.tab.h”
extern int yylval;
%}
%%
0|[1-9][0-9]* { yylval = atoi(yytext); return INTEGER; }
[+()\n] { return yytext[0]; }
. { / no hacer nada */ }
%%
y aquí está exp.y:
/*
%output “parser.cpp”
%skeleton “lalr1.cc”
*/
%{
include <stdio.h>
%}
%token INTEGER
%left ‘+’
%left ‘*’
%%
input : /* cadena vacía /
| input line
;
line : ‘\n’
| exp ‘\n’ { printf (“\t%d\n”, $1); }
| error ‘\n’
;
exp : INTEGER { $$ = $1; }
| exp ‘+’ exp { $$ = $1 + $3; }
| exp ” exp { $$ = $1 * $3; }
| ‘(‘ exp ‘)’ { $$ = $2; } ;
%%
main () {
yyparse ();
}
yyerror (char *s) {
printf (“%s\n”, s);
}
y uso el comando linux para compilarlo:
flex exp.l
bison -d exp.y
gcc exp.tab.c lex.yy.c -o exp -lfl
y muestra esto:
exp.tab.c: En la función ‘yyparse’:
exp.tab.c:1217:16: advertencia: se está implícitamente declarando la función ‘yylex’ [-Wimplicit-function-declaration]
1217 | yychar = yylex ();
|
exp.tab.c:1374:7: advertencia: se está implícitamente declarando la función ‘yyerror’; ¿quieres decir ‘yyerrok’? [-Wimplicit-function-declaration]
1374 | yyerror (YY_(“syntax error”));
|
| yyerrok
exp.y: En el nivel de la parte superior:
exp.y:28:1: advertencia: el tipo de devolución se predetermina a ‘int’ [-Wimplicit-int]
28 | main () {
|
exp.y:33:1: advertencia: el tipo de devolución se predetermina a ‘int’ [-Wimplicit-int]
33 | yyerror (char *s) {
|
exp.l:4:10: error fatal: y.tab.h: No existe el archivo o el directorio
4 | #include “y.tab.h”
|
compilación terminada.</stdio.h>
davy.ai
Parece que estás teniendo algunos problemas con tu código Lex/Yacc. Parece que estás recibiendo algunas advertencias y un error fatal. Las advertencias están relacionadas con declaraciones implícitas de las funciones
yylex
yyyerror
y el tipo de retorno se establece comoint
por defecto. El error fatal está relacionado con el archivoy.tab.h
que no se encuentra.Sería útil comprobar si el archivo
y.tab.h
está en el mismo directorio que tu código y, si lo está, asegúrate de que la ruta es correcta. Además, es posible que necesites agregar las declaraciones apropiadas para las funcionesyylex
yyyerror
en tu código.