8

ANTLR 中没有逻辑吗?我基本上试图否定我拥有的规则并且想知道它是否可能,还有逻辑吗?

4

2 回答 2

15

@larsmans 已经提供了答案,我只是想举一个 ANTLR 规则中的法律否定的例子(因为他们经常犯错误)。

ANTLR 中的否定运算符是~(波浪号)。在词法分析器规则中,~否定单个字符:

NOT_A : ~'A';

匹配除'A'and 以外的任何字符:

NOT_LOWER_CASE : ~('a'..'z');

匹配除小写 ASCII 字母以外的任何字符。lats 的例子也可以写成:

NOT_LOWER_CASE : ~LOWER_CASE;
LOWER_CASE : 'a'..'z';

只要您否定一个字符,就可以使用~. 这样做是无效的:

INVALID : ~('a' | 'aa');

因为你不能否定字符串'aa'

在解析器规则中,否定不适用于字符,而是用于标记。所以parse规则:

parse
  :  ~B
  ;

A : 'a';
B : 'b';
C : 'c';

不匹配除 以外的任何字符,'b'匹配除记号以外的任何B记号。所以它会匹配令牌A(字符'a')或令牌C(字符'c')。

相同的逻辑适用于.(DOT) 运算符:

  • 在词法分析器规则中,它匹配集合中的任何字符\u0000..\uFFFF
  • 在解析器规则中,它匹配任何标记(任何词法分析器规则)。
于 2011-04-04T06:49:22.593 回答
9

ANTLR 为无上下文语言(CFL)生成解析器。在这种情况下,not将转化为互补和and交叉。但是, CFL在补码和交集下并不封闭not(rule),即不一定是 CFG 规则。

换句话说,不可能以理智的方式实施notand因此不受支持。

于 2011-04-03T21:21:43.557 回答