有效输入示例: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 /
因此,对该输入禁用了备选方案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();};
非常感谢!
答案 0 :(得分:1)
正如编写的那样,在解析未加引号的字符串时,语法是不明确的。 abc可以解析为一个keywordExpr
(abc)或三个(a,b和c)甚至两个。我认为你希望关键字用空格分隔。但是,由于您正在跳过词法分析器中的空格,因此解析器无法区分abc
和a b c
之间的区别。
我怀疑keywordExpr
和phraseExpr
应该是词法规则:
KeywordExpr: CHAR+;
PhraseExpr: '"' CHAR+ (' ' CHAR+)* '"';
CHAR
也可能成为一个片段,以避免在您拥有单个字母关键字时意外生成CHAR
令牌。
有了这个改变,abc在词法分析器中是明确的,因为词法分析器将使用最长的匹配。
关于对空格的区别对待,如果在词法分析器中完成,则效果最佳。 PhraseExpr的上述规则将正确处理空格,因为当词法分析器遇到空格时,它无法与WS
规则匹配。在解析器中处理它要复杂得多。