Antlr4 antlr规则优先级和缺少令牌

Antlr4 antlr规则优先级和缺少令牌,antlr4,Antlr4,关于这一语法: 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”与“嵌套”模式匹配(带有“缺少:冒号

关于这一语法:

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”与“嵌套”模式匹配(带有“缺少:冒号”警告)

如何避免“abc”匹配“前缀冒号词”规则

谢谢
弗兰克

消除歧义有多种方法。也许最简单的方法是完全描述前缀:

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
规则和为
前缀生成的隐式词法规则都与
abc
中的初始
a
匹配

ANTLR为解析器中指定的每个字符串文本生成隐式lexer规则。这些隐式规则在逻辑上位于lexer语法的顶部/任何显式lexer规则之前。至少,这就是ANTLR的现状和目前的运作方式(在这方面没有官方的ANTLR规范,所以这只是一个工具实现细节)

lexer将在解析器运行之前一直运行到完成。因此,
a
很可能被标记为名为
T\u a
(隐式lexer规则的名称)的标记,而不是预期的
CHAR

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

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