es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , , ,

Answer

  1. Avatar for 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 y yyerror y el tipo de retorno se establece como int por defecto. El error fatal está relacionado con el archivo y.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 funciones yylex y yyerror en tu código.

Comments are closed.