grammar - Antlr parsing numbers problem -


i have problem parsing integer & hex numbers. want parse c++ enums following rules:

grammar enum;  rule_enum :   'enum' id '{' enum_values+ '}'';';  enum_values :   enum_value (comma enum_value)+;  enum_value :   id ('=' number)?;  number  :   hex_number | integer_number;  hex_number :   '0' 'x' hex_digit+;  integer_number :   digit+;  fragment hex_digit : ('0'..'9'|'a'..'f'|'a'..'f') ;  fragment digit   :   ('0'..'9');  comma   :   ',';   id  :   ('a'..'z'|'a'..'z'|'_') ('a'..'z'|'a'..'z'|'0'..'9'|'_')*; 

the problem have following - when parsing code like:

enum enum {     option1 = 0,     option2 = 1 }; 

it not recognize 0 integer_number tries parse hex_number. how can resolve this?

thank you. tobias

first, fragment rules can "seen" lexer rules, not parser rules. so, following invalid:

integer_number :   digit+; // can't use digit here!  fragment digit   :   ('0'..'9'); 

to fix ambiguity these numbers, it's imo best make these integer- , hex numbers lexer rules instead of parser rules.

an example:

grammar enum;  rule_enum :   'enum' id '{' enum_values+ '}'';';  enum_values :   enum_value (comma enum_value)+;  enum_value :   id ('=' number)?;  number   :  hex_number   |  integer_number   ;  hex_number :   '0' 'x' hex_digit+;  integer_number :   digit+;  fragment hex_digit : ('0'..'9'|'a'..'f'|'a'..'f') ;  fragment digit   :   ('0'..'9');  comma   :   ',';  id  :   ('a'..'z'|'a'..'z'|'_') ('a'..'z'|'a'..'z'|'0'..'9'|'_')*;  space : (' ' | '\t' | '\r' | '\n') {skip();}; 

which produces following parse tree of example snippet:

enter image description here


Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -