Hola a todos. Mi duda es la siguiente:
Estoy realizando un compilador utilizando para ello la herramienta yacc que sirve para evaluar la sintaxis del lenguaje que dicho compilador tratará.
En el lenguaje que soportará mi compilador puede haber declaraciones de variables como en C:
int x;
y expresiones como por ejemplo:
x=x+1; (tambien al estilo C).
El fichero que le paso a la herramienta YACC con la especificación del lenguaje para reflejar lo anteriormente comentado tiene el siguiente aspecto:
programa: declaraciones expresiones
declaracionVariables: Tipo listaIdentificadores
declaraciones:
|declaraciones declaracionVariables ';'
listaIdentificadores: ID
| listaIdentificadores ',' ID
sentencias:
|sentencias sentencia
sentencia: expresion ';'
expresion: expresion '+' expresion
|expresion '-' expresion
CTE_ENTERA
|ID
Tipo: INT
|CHAR
|ID
Las palabras en mayusculas son tokens que devuelve el léxico. El problema lo tengo cuando pongo un programa del tipo:
int x;
Ejemplo e;
x=x+1;
siendo Ejemplo por ejemplo una estructura declarada anteriormente:
struct Ejemplo{
int x;
}
Me da error sintáctico en la tercera linea porque al poner en el fichero que paso al yacc que el no terminal 'Tipo' puede ser un ID (identificador) se piensa que la tercera linea es una declaración de otra variable por lo que cuando llega al caracter '=' da el error porque según el fichero del sintactico lo que tendría que venir a continuación debería ser un ID (es decir, el nombre de la variable).
¿como puedo solucionar este error?
Darse cuenta que lo que quiero es que en los programas pueda declarar variables del tipo:
int x;
char c;
Ejemplo e; siendo Ejemplo un tipo (en este caso una estructura) definida por el usuario, es decir , que en mi fichero que refleja la sintaxis del lenguaje el no terminal 'Tipo' pueda ser un identificador (ID), no unicamente las palabras del lenguaje reservadas 'int' o 'char'.
Un saludo.