关于这个语法:
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 :(得分: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
规则生成的隐式词法分析器规则都与{{1}中的初始a
匹配}}。
ANTLR为解析器中指定的每个字符串文字生成隐式词法分析器规则。这些隐式规则在任何显式词法分析器规则之前逻辑上放在词法分析器语法的顶部。至少,这是ANTLR目前的运作方式(目前还没有官方的ANTLR规范,因此它都是工具实现细节)。
词法分析器将在解析器运行之前运行完毕。因此,abc
可能被标记为名为a
(隐式词法分析器规则的名称)而不是T__a
的标记。
最好的建议是永远不要在解析器中使用字符串文字。