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.

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>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el archivo lex no tiene la declaración de yylval. Para poder usar yylval en el archivo lex, necesitas incluir el archivo de encabezado y.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:

    %{
    #include "y.tab.h"
    %}
    

    Luego, en la terminal, debes ejecutar los siguientes comandos:

    lex archivo.l 
    yacc -d archivo.y
    gcc -o archivo y.tab.c lex.yy.c -ll
    

    Ten en cuenta que la opción -d se utiliza en yacc para generar tanto y.tab.c como un archivo de encabezado y.tab.h que define los valores de los tokens. Además, al compilar con gcc, debes enlazar tanto y.tab.c como lex.yy.c.

Comments are closed.