ANTLR有非贪婪的规则

时间:2015-03-31 16:38:36

标签: antlr grammar antlr4 greedy

我想拥有以下语法(部分内容):

expression 
: 
expression 'AND' expression
| expression 'OR' expression
| StringSequence
;

StringSequence
: 
StringCharacters
;

fragment
StringCharacters
: StringCharacter+
;

fragment
StringCharacter
: ~["\]
| EscapeSequence
;

它应匹配" a b c d f" (没有引号),以及" a AND b和c"。

问题是我的规则StringSequence是贪婪的,并且也消耗OR / AND。我尝试过不同的方法,但无法以正确的方式使用我的语法。 ANTLR4可以实现吗?请注意,我不想在每个字符串周围加上引号。引号工作正常,因为规则变得非贪婪,即:

StringSequence
: '"' StringCharacters? '"'
;

2 个答案:

答案 0 :(得分:2)

您没有空白规则,因此StringCharacter匹配除引号和反斜杠字符(+转义序列)之外的所有内容。包含空格规则以使其与单个AND / OR标记匹配。另外,我建议为字符串文字('AND''OR')定义词法分析器规则,而不是将它们嵌入(解析器)规则中。这样你不仅可以获得令牌的说话名称(而不是自动生成的名称),但你也可以更好地控制匹配顺序。

答案 1 :(得分:1)

但这是一个天真的解决方案:

StringSequence : 
  (StringCharacter | NotAnd | NotOr)+
;
fragment NotAnd :
  'AN' ~'D'
| 'A' ~'N'
;
fragment NotOr:
  'O' ~('R')
;
fragment StringCharacter :
  ~('O'|'A')
;

使用Whitespace规则获得更复杂一点。另一种解决方案是使用语义谓词展望并阻止读取关键字。