我想拥有以下语法(部分内容):
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? '"'
;
答案 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规则获得更复杂一点。另一种解决方案是使用语义谓词展望并阻止读取关键字。