Proyecto de compilador C-- para la clase de compiladores con Ulises Mercado
Hola,
En este proyecto intentamos elaborar un compilador para el lenguaje C −− (definido más adelante), que realizará una traducción a codigo objeto a una máquina hipotética para esto usamos las herramientas flex y yacc.
Gramática.
-
programa → lista declaraciones
-
lista declaraciones → lista declaraciones declaracion | declaracion
-
declaracion → declaracion variables | declaracion funcion | tipo struct
-
declaracion variables → tipo lista variables;
-
lista variables → lista variables , lista | lista
-
lista → id arreglo
-
arreglo → [numero] arreglo | ε
-
tipo → int | float | double | char | void | tipo struct
-
tipo struct → struct id { cuerpo struct } | struct { cuerpo struct } | struct id
-
cuerpo struct → cuerpo struct declaracion variables | declaracion variables
-
declaracion funcion → tipo id( parametros ) bloque
-
parametros → lista parametros | void
-
lista parametros → lista parametros , parametro | parametro
-
parametro → tipo id arrparam
-
arrparam → [ ] arrparam | ε
-
bloque → { delcaraciones locales lista sentencias }
-
declaraciones locales → declaraciones locales declaracion variables | ε
-
lista sentencias → lista sentencias sentencia | ε
-
sentencia → sentencia exp | sentencia if | sentencia while | sentencia do | sentencia switch |
sentencia for | sentencia break | sentencia return | bloque | sentencia imprime | sentencia lee
-
sentencia exp → expresion; | ;
-
sentencia if → if( expresion ) sentencia sentencia else
-
sentencia else → else sentencia | ε
-
sentencia while→ while( expresion ) sentencia
-
sentencia do → do sentencia while(expresion );
-
sentencia switch → switch(id){ lista casos case default }
-
lista casos → lista casos sentencia case | sentencia case
-
sentecia case → case entero: sentencia sentencia break
4
-
case defualt → default: sentencia sentencia break | ε
-
sentencia for → for( expresion ; expresion ; sentencia incremento ) sentencia
-
sentencia break → break;
-
sentencia incremento → id++ | id- -
-
sentencia imprime → print( expresion );
-
sentencia lee → scan(id);
-
sentencia return → return; | return expresion ;
-
expresion → variable operador asignacion expresion | expresion simple
-
operador asignacion → = | += | -= | *= | /= | %=
-
variable → id vararrg | id.id
-
vararrg → [ expresion ] vararrg | ε
-
expresion simple → expresion simple operador relacional operando | expresion simple oper- ador logico operando | operando
-
operado logico → && | ||
-
operador relacional → <= | >= | < | > | == | ! =
-
operando → operando operador adicion termino | termino
-
oprador adicion → + | -
-
termino → termino operador mul factor | factor
-
operador mul → * | / | %
-
factor → variable | llamada | ( expresion ) | entero | flotante | caracter | cadena |
dobleprecision | !expresion | -expresion
-
llamada → id( argumentos )
-
argumentos → lista argumentos | ε
-
lista argumentos → lista argumentos , expresion | expresion