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"匹配"前缀结肠字"规则?

谢谢Franck

有多种删除歧义的方法。也许最简单的是完全表征前缀:

input : ( nested | word)* EOF ;
nested: PREFIX word ;
word  : CHAR+ ;
PREFIX: 'a:' | 'b:' ;
CHAR  : [a-zA-ZÀ-ÿ0-9] | '.' | '_' ;
WS    : [ rnt]+ -> skip ;

添加:

OP语法中的歧义是由于CHAR规则和为prefix规则生成的隐式Lexer规则都匹配abc中的初始a

antlr为解析器中指定的每个字符串生成隐式lexer规则。这些隐式规则在逻辑上放置在Lexer语法的顶部/在任何明确的Lexer规则之前。至少,这是ANTLR的使用方式和目前的运作方式(对此没有官方的ANTLR规范,因此这都是工具实施细节(。

在解析器运行之前,Lexer将运行到完成。因此, a可能被标记为代币,命名为 T__a(隐式lexer规则的名称(,而不是预期的 CHAR

最佳建议是切勿在解析器中使用字符串文字。

最新更新