ANTLR:词法分析器或解析器错误?

时间:2011-12-26 08:41:34

标签: antlr lexer

我在ANTLR中写了一个简单的词法分析器,ID的语法是这样的:

ID  :   (('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*|'_'('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*);

(开头不允许数字)

当我生成代码(在java中)并测试输入时:

3a

我预计会出现错误,但输入被识别为“INT ID”,如何修复语法以使其报告错误?(仅使用词法规则)

感谢您的关注

1 个答案:

答案 0 :(得分:1)

请注意,您的规则可以重写为:

ID
 : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' |'_')*
 ;    

fragments(不会产生令牌的规则,但仅由其他词法规则使用):

ID
 : (Letter | '_') (Letter| Digit |'_')*
 ;

fragment Letter
 : 'a'..'z'
 | 'A'..'Z'
 ;

fragment Digit
 : '0'..'9'
 ;

但是如果你的词法分析器识别出像"3a"这样的输入并生成标记INTID,那么你就不应该改变任何东西。

表示,您的解析器规则可能会出现此类输入的问题

如果你真的想让lexer处理这类东西,你可以这样做:

INT
 : Digit+ (Letter {/* throw an exception */})?
 ;

如果您想允许INT文字可能以fL结尾,那么您首先必须检查Letter的内容以及是否<= 1}}或"f",你抛出异常。