0

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

有效输入示例:abc "xyz def" abc 应被识别为 keywordExpr 标记,而 "xyz def" 应被识别为 phraseExpr。

[14:32:24] 警告(200):TestExpr.g:12:4:决策可以使用多种选择匹配输入,例如“CHAR”:1、2

结果,该输入 [14:32:24] 警告(200)的替代项 2 被禁用:/Users/imochurad/ Development /antlr3/Grammars/TestExpr.g:12:4:Decision can match input such作为 "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();};

非常感谢!

4

1 回答 1

1

正如它所写的那样,在解析未引用的字符串时,您的语法是模棱两可的。abc 可以被解析为一个keywordExpr(abc)或三个(a、b 和 c)甚至两个。我认为您希望关键字用空格分隔。但是,由于您在词法分析器中跳过空格,因此解析器无法区分abca b c

我怀疑keywordExpr并且phraseExpr应该是词法分析器规则:

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

CHAR可能也应该成为一个片段,以避免CHAR当你有一个单字母关键字时意外生成一个标记。

随着这种变化,abc 在词法分析器中是明确的,因为词法分析器将使用最长的匹配。

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

于 2013-07-10T16:46:54.633 回答