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/