首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >antlr v3词法分析器预测错误

antlr v3词法分析器预测错误
EN

Stack Overflow用户
提问于 2014-03-13 22:16:33
回答 1查看 69关注 0票数 1

考虑以下(组合)语法

代码语言:javascript
运行
复制
grammar CastModifier;
tokens{
 E='=';
 C='=()';
 Lp='(';
 Rp=')';
 I = 'int';
 S=';';
}

compilationUnit
    : assign+ EOF
    ;

assign
    :   '=' Int ';'
    |   '=' '(' 'int' ')' Int ';'
    |   '=()' Int ';'
    ;

Int
    :   ('1'..'9') ('0'..'9')*
        |    '0'
        ;

Whitespace  
    :   (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;}
    ;

不幸的是,词法分析器并不总是正确地预测下一个令牌。例如,下面的代码

代码语言:javascript
运行
复制
=(int) 1;

词法分析器预测它必须是'=()‘标记。它为以下代码检测正确的令牌

= (int) 1;

我认为如果我为规则“assign”提供以下选项,这个问题应该可以由ANTLR解决:

代码语言:javascript
运行
复制
options{k=3;}

但显然它没有帮助,如果我为整个语法定义这个选项也没有帮助。如何解决此问题?我目前的解决方法是在'='('')‘的基础上构建'=()’标记,但这允许用户编写

= ()

这还可以,但是我想知道为什么ANTLR不能正确地预测它。

EN

回答 1

Stack Overflow用户

发布于 2014-03-14 16:05:21

options{k=3;}使解析器最多提前查找3个标记,而不是词法分析器。ANTLR3的词法分析器没有那么聪明:一旦它匹配了一个字符,它就不会放弃这个匹配。因此,在您的示例中,来自输入=(int) 1;=(是匹配的,但是在char流中有一个i,并且没有与之匹配的标记。

我目前的解决方法是在'='('')‘的基础上构建'=()’标记

我认为这是一个合适的解决方案:'=''('')'是单独的令牌,应该这样处理(在解析器中粘合在一起,而不是在词法分析器中)。

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

https://stackoverflow.com/questions/22381373

复制
相关文章

相似问题

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