我正在尝试为 oracle Q 引用字符串机制实现词法分析器规则,其中我们有类似 q'$some string$' 的东西
在这里,您可以使用任何字符代替 $,而不是空格、(、{、[、<,但字符串必须以相同的字符开头和结尾。接受标记的一些示例是:q'!some string!' q 'ssome strings' 注意 s 是自定义分隔符,但也可以在字符串中包含它,因为我们只会以 s 结尾
这是我尝试实施规则的方式:
Q_QUOTED_LITERAL: Q_QUOTED_LITERAL_NON_TERMINATED . QUOTE-> type(QUOTED_LITERAL);
Q_QUOTED_LITERAL_NON_TERMINATED:
Q QUOTE ~[ ({[<'"\t\n\r] { setDelimChar( (char)_input.LA(-1) ); }
( . { !isValidEndDelimChar() }? )*
;
我已经检查了从 !isValidEndDelimChar() 获得的值,并且我在正确的地方得到了一个错误的谓词,所以一切都应该工作,但 antlr 只是忽略了这个谓词。我也尝试过移动谓词,将该部分放在单独的规则中,以及其他一些东西,经过一天半的研究,我终于提出了这个问题。
我也尝试过以其他方式实现它,但似乎没有办法在 antlr4 中实现自定义字符分隔字符串(antlr3 版本曾经工作)。