ANTLR 中没有逻辑吗?我基本上试图否定我拥有的规则并且想知道它是否可能,还有逻辑吗?
问问题
7770 次
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 规则。
换句话说,不可能以理智的方式实施not
,and
因此不受支持。
于 2011-04-03T21:21:43.557 回答