关于此语法:
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
。
最佳建议是切勿在解析器中使用字符串文字。