ANTLR警告多种替代方案,如何理解它以及如何摆脱它?

时间:2013-06-12 17:35:31

标签: antlr antlr3 antlrworks

ANTLR专家,您能否解释一下为什么在ANTLWorks中会出现此警告?如何理解这条消息以及如何在这种特殊情况下摆脱它?

有效输入示例:abc“xyz def” abc应被识别为keywordExpr令牌,“xyz def”应被识别为phraseExpr。

[14:32:24]警告(200):TestExpr.g:12:4: 决策可以使用多个替代方案匹配输入,例如“CHAR”:1,2

结果,对该输入禁用了备选方案2 [14:32:24]警告(200):/Users/imochurad / Development/antlr3/Grammars/TestExpr.g:12:4: 决策可以使用多个替代方案匹配输入,例如“CHAR”:1,2

因此,对该输入禁用了备选方案2

grammar TestExpr;

options {
output=AST;
    ASTLabelType=CommonTree; 
}

expr
    :   kpExpr*;
kpExpr  :   keywordExpr|phraseExpr; 
keywordExpr
    :   CHAR+;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
phraseExpr
    :   '"' CHAR+ (' ' CHAR+)* '"';
CHAR    :   ('A'..'Z') | ('a'..'z');
INT :   '0'..'9'+;
NEWLINE :   '\r'? '\n';
WS  :   (' '|'\t'|'\n'|'\r')+ {skip();};

非常感谢!

1 个答案:

答案 0 :(得分:1)

正如编写的那样,在解析未加引号的字符串时,语法是不明确的。 abc可以解析为一个keywordExpr(abc)或三个(a,b和c)甚至两个。我认为你希望关键字用空格分隔。但是,由于您正在跳过词法分析器中的空格,因此解析器无法区分abca b c之间的区别。

我怀疑keywordExprphraseExpr应该是词法规则:

KeywordExpr: CHAR+;
PhraseExpr:  '"' CHAR+ (' ' CHAR+)* '"';

CHAR也可能成为一个片段,以避免在您拥有单个字母关键字时意外生成CHAR令牌。

有了这个改变,abc在词法分析器中是明确的,因为词法分析器将使用最长的匹配。

关于对空格的区别对待,如果在词法分析器中完成,则效果最佳。 PhraseExpr的上述规则将正确处理空格,因为当词法分析器遇到空格时,它无法与WS规则匹配。在解析器中处理它要复杂得多。