2017-05-05 106 views
0

对此语法:ANTLR规则优先级和丢失的令牌

CHAR : ([a-zA-ZÀ-ÿ0-9] | '.' | '_') ; 
COLON : (':') ; 
prefix: ('a' | 'b') ; 
word : (CHAR)+ ; 
nested: prefix COLON word ; 
item : word ; 
input : (WS | nested | word)* ; 

而这种输入:

gef a:test abc 

我想解析ABC像一个“字”,但这个语法,“ABC”匹配“嵌套”模式(带有“丢失:COLON”警告)

如何避免“abc”匹配“前缀COLON字”规则?

感谢 弗兰克

回答

0

有多种方法消除不确定性。也许最简单的就是全面检定前缀:

input : (nested | word)* EOF ; 
nested: PREFIX word ; 
word : CHAR+ ; 

PREFIX: 'a:' | 'b:' ; 
CHAR : [a-zA-ZÀ-ÿ0-9] | '.' | '_' ; 
WS : [ \r\n\t]+ -> skip ; 

补充:

在OP语法歧义是由于这样的事实,无论是CHAR规则,为prefix规则生成的隐含的词法规则两者都与abc中的初始a匹配。

ANTLR为解析器中指定的每个字符串字面值生成隐式词法分析器规则。这些隐式规则逻辑地放置在词法分析器的顶部/任何显式词法分析器规则之前。至少,ANTLR是如何运作的(目前没有官方的ANTLR规范,所以这都是工具实现细节)。

分析器运行前,词法分析器将运行完成。因此,a很可能被标记为一个名为T__a(隐式词法分析器规则的名称)的令牌,而不是CHAR

最好的建议是不要在解析器中使用字符串文字。

+0

其实在“真”语法中,这就是我所做的。但我想更好地理解为什么存在歧义,因为“abc”与'a | b''不匹配:'[a-z] * –

+0

我已经更新了答案。 – GRosenberg