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 ;

0 Comments:

Post a Comment

<< Home