Friday, March 11, 2005

Comentario 5 sobre Proyecto MicroC

Sobre el problema de la semana pasada que el parser no tiraba ningun error ni ningun warning, y no se que fue lo que paso ya que lo que hice fue que le di copy/paste a la gramatica, como el laboratorio que hicimos que solo era darle copy/paste, pero la diferencia es que era en el lexer y esta vez fue en el parser, casi toda la semana trate de ver el porque sucedia eso, creaba otro proyecto, en otro lado, y nada hasta que se me ocurrio escribirlo todo, y cada gramatica que escribia compilaba y hasta entonces repartaba lo errorres y los warnings, ya estoy listo para terminar, solo me falta aprender a manejar la tabla hash para poder realizar con exito la tabla de simbolos y verificar los id's duplicados, por lo demas solo son detalles que hacen falta y una ambiguedad de la gramatica de statement que falta por resolver a cabalidad.
Se agradece al ingeniero por darnos 6 dias mas para resolver este proyecto, y ademas que me di cuenta que habian compañeros que por otras clases estaban retrasados asi como yo y me siento bien al saber que vamos a poder terminar el proyecto.

Friday, March 04, 2005

Comentario 4 sobre Proyecto MicroC

Sobre el Lexer tengo una inquietud con definir string_constant e integer_constant y char_constant los cuales los defini asi y a mi pareser estan bien pero quisiera que me comentara si es asi como hay que definirlo o tengo que buscar otra forma:
protected DIGITO: ('0')|('1'|'2'..'9');
INTEGER_CONSTANT: (DIGITO)+ ;
STRING_CONSTANT: '"' ! ('\3'..'\377' ~('"'|'\n'|'\r'|'\t'|'\\') )* '"' !;
protected CHAR_CONSTANT: '"'! ('\3'..'\377' ~'"') '"'! ;
/*estara bien colocarle protected o no ya que si no lo hago aprace un warning, y al
*ponerlo deparece el warning
*el cual dice lexical nondeterminism between rules STRING_CONSTANT and CHAR_CONSTANT
*upon k==1:'"' k==2:'\u0003'..'\u00ff'
*/
o si se lo quito y se lo pongo al string_constant tambien desaparece el warning, y no se como dejarlo o no importa el warning

Esta semana empece el Parser, comence buscando cuales de la gramatica tenian ambiguedades y las arregle y a las que tenian recursion por la izquierda tambien.
Pero se me ha presentado un problema extraño y es que despues de escribir todas las gramaticas en el parser no me tira ningun error y ningun warning, entonces escribi cosas que sabia que estaban malas y que no debian compilar y compila, tambien si escribia una gramatica con recursion (pero solamente una como ser statement), se me desplegaba un mensaje indicandome que no estaba correcta la gramatica que tenia recursion, pero al escribir las demas gramaticas dejando esa mala me compila sin errores y sin warnings pero al correr dice:
line 1:1: expecting ID, found 'void' y el parser lo tengo de la siguiente manera:
class P extends Parser;
options
{
k = 2;
buildAST = true;
}
startRule:
translation_unit: external_declaration translation_unit_prim;
translation_unit_prim: external_declaration translation_unit_prim |;
external_declaration: function_definition | declaration ; function_definition: function_def_header function_body ;
function_def_header: return_type ID PARENTESIS_IZQUIERDO parameters _def PARENTESIS_DERECHO;
return_type: type | VOID ;
parameters_def: parameter_def_list | VOID ;
parameter_def_list: type ID parameter_def_list_prim ;
parameter_def_list_prim: COMA type ID parameter_def_list_prim | ;
function_body: LLAVE_IZQUIERDA declarations statement_list LLAVE_DERECHA ;
declarations: declarations_prim ;
declarations_prim: declaration declarations_prim |;
declaration: variable_declaration |function_declaration ;
variable_declaration: type identifier_list PTCOMA ;
function_declaration: return_type ID PARENTESIS_IZQUIERDO parameters _decl PARENTESIS_DERECHO PTCOMA ;
parameters_decl: parameter_decl_list | parameter_decl_list PTCOMA TPUNTO | VOID ;
parameter_decl_list: parameter_decl_spec | parameter_decl_list PTCOMA parameter_decl_spec ;
parameter_decl_spec: type ID ;
statement_list: statement_list statement | statement ;
statement: expression PTCOMA |RETURN exp |
WHILE PARENTESIS_IZQUIERDO expression PARENTESIS_DERECHO statement |
IF PARENTESIS_IZQUIERDO expression PARENTESIS_DERECHO statement ipepds |
LLAVE_IZQUIERDA statement_list LLAVE_DERECHA |BREAK PTCOMA | CONTINUE PTCOMA ;
ipepds: ELSE statement |;
exp: expression PTCOMA | PTCOMA ;
factor: constant
|PARENTESIS_IZQUIERDO expression PARENTESIS_DERECHO
|ADD_OP factor |ID h ;
h: PARENTESIS_IZQUIERDO p |;
p: expression_list PARENTESIS_DERECHO | PARENTESIS_DERECHO | expression PARENTESIS_DERECHO;
constant: STRING_CONSTANT | CHAR_CONSTANT | numeric_constant ;
expression_list: expression expression_list_prim ;
expression_list_prim: PTCOMA expression expression_list_prim |;
numeric_constant: INTEGER_CONSTANT ;
expression: equality_expression eeasig ;
eeasig: ASIGNACION equality_expression ;
equality_expression: relational_expression re_eqop ;
re_eqop: EQ_OP relational_expression | ;
relational_expression: simple_expression se_relop ;
se_relop: REL_OP simple_expression |;
simple_expression: term simple_expression_prim ;
simple_expression_prim: ADD_OP term simple_expression_prim |;
term: factor term_prim ;
term_prim: MUL_OP factor term_prim |;
identifier_list: ID identifier_list_prim ;
identifier_list_prim: COMA ID identifier_list | ;
type: INT | CHAR ;