【发布时间】:2011-07-28 19:15:45
【问题描述】:
ANTLR 中没有逻辑吗?我基本上试图否定我拥有的规则,并且想知道它是否可能,还有 AND 逻辑吗?
【问题讨论】:
标签: antlr grammar antlr3 formal-languages
ANTLR 中没有逻辑吗?我基本上试图否定我拥有的规则,并且想知道它是否可能,还有 AND 逻辑吗?
【问题讨论】:
标签: antlr grammar antlr3 formal-languages
@larsmans 已经提供了答案,我只是想举一个 ANTLR 规则中的法律否定的例子(因为他们经常犯错误)。
ANTLR 中的否定运算符是~(波浪号)。在词法分析器规则中,~ 否定单个字符:
NOT_A : ~'A';
匹配除'A' 和:以外的任何字符:
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 中的任何字符;【讨论】:
NOT_LOWER_CASE : ~[a-z]; LOWER_CASE : [a-z];
ANTLR 为context-free languages (CFL) 生成解析器。在这种情况下,not 将转换为补码,and 将转换为交集。但是,补和交下的CFLs aren't closed,即not(rule)不一定是CFG规则。
换句话说,不可能以理智的方式实现not 和and,因此它们不受支持。
【讨论】: