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:
Comments
Post a Comment