Antlr解析数字问题

时间:2011-02-18 07:24:23

标签: antlr grammar

我在解析整数和放大器时遇到问题十六进制数。我想用以下规则解析C ++枚举:

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'|'_')*;

我遇到的问题如下:解析代码时:

enum Enum
{
    Option1 = 0,
    Option2 = 1
};

它不会将0识别为integer_number,但会尝试将其解析为hex_number。我该如何解决这个问题?

谢谢。 托拜厄斯

2 个答案:

答案 0 :(得分:4)

首先,片段规则只能由词法规则“看到”,而不是解析器规则。因此,以下内容无效:

integer_number
:   DIGIT+; // can't use DIGIT here!

fragment
DIGIT   :   ('0'..'9');

为了解决这些数字的歧义,IMO最好制作这些integer - 和hex数字词法规则,而不是解析器规则。

一个例子:

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();};

生成示例代码段的以下解析树:

enter image description here

答案 1 :(得分:1)

以下ANTLR仅适用于枚举的数字位。 (编辑包括巴特的建议)

grammar enum;

number  :   
    integer_number | hex_number ;

hex_number
    :   HEX_NUMBER;

integer_number
    :   INT_NUMBER;


HEX_NUMBER
    :   HEX_INTRO HEX_DIGIT+;

INT_NUMBER
    :   DIGIT+;

HEX_INTRO
    :   '0x';


DIGIT   :   ('0'..'9');


HEX_DIGIT 
    : ('0'..'9'|'a'..'f'|'A'..'F') ;