我用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“,我如何修复语法以使其报告错误?(仅使用lexer规则)
感谢您的关注
发布于 2011-12-27 00:34:09
请注意,您的规则可以重写为:
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的内容,如果不是"f"或"L",则抛出异常。
https://stackoverflow.com/questions/8634163
复制相似问题