antlr 2规则歧义

时间:2012-06-13 08:31:21

标签: antlr2

   DECIMAL_LITERAL : ('0' | '1'..'9' ('0'..'9')*) (INTEGER_TYPE_SUFFIX)? ;

   FLOATING_POINT_LITERAL

   :   ('0'..'9')+ 

       (
           DOT ('0'..'9')* (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
       |   EXPONENT (FLOAT_TYPE_SUFFIX)?
       |   FLOAT_TYPE_SUFFIX
       )
       |   DOT ('0'..'9')+ (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
   ;

DECIMAL_LITERAL匹配c语言中的int literal,FLOATING_POINT_LITERAL匹配c语言中的float literal。但是当词法分析器遇到一个浮点数,例如3.44时,3将匹配规则DECIMAL_LITERAL。

我该怎么做才能识别浮动文字?

1 个答案:

答案 0 :(得分:0)

您将规则合并为一个词法分析器规则,然后根据您是否看到DOT更改类型。这应该会给你一个想法,虽然它与你上面写的不完全相同。

DECIMAL_LITERAL 
:   ('0'..'9')+ 
   (
       DOT { _ttype = FLOATING_POINT_LITERAL; } ('0'..'9')* (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
   |   EXPONENT (FLOAT_TYPE_SUFFIX)?
   |   FLOAT_TYPE_SUFFIX
   )
   |   DOT { _ttype = FLOATING_POINT_LITERAL; } ('0'..'9')+ (EXPONENT)? (FLOAT_TYPE_SUFFIX)?
;

有关更完整的示例,请参阅http://www.antlr3.org/grammar/cgram/

中的C语法