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.

YACC y LEX, Obteniendo error de sintaxis al final de la línea y no logro entender por qué.

Estoy tratando de construir mi compilador en lex y yacc para mi trabajo.
He estado intentando durante mucho tiempo pero todavía obtengo un error de sintaxis en la salida.
Este es mi yacc:

%token <ival> DIGIT
%token LOAD
%token ADD
%token MOD
%token SUB
%token MUL
%token INC
%token DEC
%token WS
%token EOL

%%

line :LOAD WS DIGIT EOL{ printf("comando_carga:%d\n",$3);  }
     | ADD EOL{ printf("¡suma!\n");  }
     | MOD EOL{ printf("¡módulo!\n");  }
     | SUB EOL{ printf("¡resta!\n");  }
     | MUL EOL{ printf("¡multiplicación!\n");  }
     | INC EOL{ printf("¡incremento!\n");  }
     | DEC EOL{ printf("¡decremento!\n");  }
     ;

%%

Esto es lex:

load [c][a][r][g][a][r]
add [s][u][m][a]
sub [r][e][s][t][a]
mul [m][u][l][t][i][p][l][i][c][a][r]
mod [m][o][d][u][l][o]

inc [i][n][c][r][e][m][e][n][t][a][r]
dec [d][e][c][r][e][m][e][n][t][a][r]

digit [0-9]+


character [a-zA-Z]




eol [\n\r]

%%

{eol} {return(EOL);}
[\t]+        {return(WS);}
[ ]+        {return(WS);}
{digit}       {yylval.ival = atoi(yytext);return(DIGIT);}
{load}  { return(LOAD); }
{add}  { return(ADD); }
{sub}  { return(SUB); }
{mul}  { return(MUL); }
{mod}  { return(MOD); }
{inc}  { return(INC); }
{dec}  { return(DEC); }


.            {return(yytext[0]);}
%%

La entrada es:

load 1
load 2
sub
load 5
mod

y la salida es:

comando_carga:1
error de sintaxis

Ya he definido EOF, pero aún obtengo un error de sintaxis al final de la línea, ¿por qué?
No puedo entender por qué obtengo estos resultados.

Solo hay una línea de salida “comando_carga:1”, ¿puede ser un problema de EOF? ¿o no?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que el error de sintaxis esté siendo causado por la última línea del archivo de entrada que no termina con un carácter de fin de línea (EOL). En tu analizador léxico, has definido EOL como [\n\r], pero si la última línea del archivo de entrada no termina con ninguno de esos caracteres, el analizador léxico no lo reconocerá como el final de una línea y puede devolver un error de sintaxis.

    Una forma de solucionar esto es agregar una regla al final de tu analizador léxico para manejar el caso en el que el archivo de entrada termine abruptamente sin un carácter de fin de línea. Por ejemplo:

    \z { return(EOL); }
    

    Esta regla coincide con el final del archivo de entrada (indicado por \z) y devuelve un token de EOL, lo que debería permitir que tu analizador finalice el análisis del archivo sin un error de sintaxis.

    Otra cosa a verificar es si hay otros errores de sintaxis en el archivo de entrada que no se estén reportando. Es possible que el analizador sea capaz de recuperarse de algunos errores de sintaxis (por ejemplo, si una línea falta de un token requerido), pero no de otros. Podrías intentar agregar reportes de error más detallados en tu analizador (por ejemplo, usando yyerror() para imprimir mensajes de error específicos) para ayudar a diagnosticar cualquier otro problema.

Comments are closed.