ANTLR 2 规则歧义


   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 文本,FLOATING_POINT_LITERAL C 语言中匹配浮点文本。但是当词法分析器遇到浮点数时,例如 3.44,3 将匹配规则 DECIMAL_LITERAL。

我该怎么做才能让它识别浮点字面?

将规则合并到一个词法分析器规则中,然后根据是否看到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)?
;

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

最新更新