首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR :词法分析器或解析器错误?

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

Stack Overflow用户
提问于 2011-12-26 16:41:34
回答 1查看 336关注 0票数 1

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

代码语言:javascript
复制
ID  :   (('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*|'_'('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*);

(开头不允许有数字)

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

代码语言:javascript
复制
3a

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

感谢您的关注

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-27 00:34:09

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

代码语言:javascript
复制
ID
 : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' |'_')*
 ;    

或者使用fragments (不会生成标记的规则,但仅供其他词法分析器规则使用):

代码语言:javascript
复制
ID
 : (Letter | '_') (Letter| Digit |'_')*
 ;

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

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

但是,如果像"3a"这样的输入被您的词法分析器识别并生成标记INTID,那么您就不应该进行任何更改。这种输入的问题可能会出现在您的解析器规则中,因为它在语义上是不正确的。

如果你真的想让lexer来处理这类事情,你可以这样做:

代码语言:javascript
复制
INT
 : Digit+ (Letter {/* throw an exception */})?
 ;

如果您希望允许INT文字可能以fL结尾,则必须首先检查Letter的内容,如果不是"f""L",则抛出异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8634163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档