我在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”,如何修复语法以使其报告错误?(仅使用词法规则)
感谢您的关注
答案 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"
这样的输入并生成标记INT
和ID
,那么你就不应该改变任何东西。
如果你真的想让lexer处理这类东西,你可以这样做:
INT
: Digit+ (Letter {/* throw an exception */})?
;
如果您想允许INT
文字可能以f
或L
结尾,那么您首先必须检查Letter
的内容以及是否<= 1}}或"f"
,你抛出异常。