考虑以下(组合)语法
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;}
;
不幸的是,词法分析器并不总是正确地预测下一个令牌。例如,下面的代码
=(int) 1;
词法分析器预测它必须是'=()‘标记。它为以下代码检测正确的令牌
= (int) 1;
我认为如果我为规则“assign”提供以下选项,这个问题应该可以由ANTLR解决:
options{k=3;}
但显然它没有帮助,如果我为整个语法定义这个选项也没有帮助。如何解决此问题?我目前的解决方法是在'='('')‘的基础上构建'=()’标记,但这允许用户编写
= ()
这还可以,但是我想知道为什么ANTLR不能正确地预测它。
发布于 2014-03-14 16:05:21
options{k=3;}
使解析器最多提前查找3个标记,而不是词法分析器。ANTLR3的词法分析器没有那么聪明:一旦它匹配了一个字符,它就不会放弃这个匹配。因此,在您的示例中,来自输入=(int) 1;
的=(
是匹配的,但是在char流中有一个i
,并且没有与之匹配的标记。
我目前的解决方法是在'='('')‘的基础上构建'=()’标记
我认为这是一个合适的解决方案:'='
、'('
和')'
是单独的令牌,应该这样处理(在解析器中粘合在一起,而不是在词法分析器中)。
https://stackoverflow.com/questions/22381373
复制相似问题