如何~
在 ANTLR 的词法分析器和解析器规则中使用否定元字符?
问问题
10380 次
1 回答
36
否定可以发生在词法分析器和解析器规则中。
在词法分析器规则中,您可以否定字符,在解析器规则中,您可以否定标记(词法分析器规则)。但是词法分析器和解析器规则都只能分别否定单个字符或单个标记。
几个例子:
词法分析器规则
要匹配除小写 ascii 字母之外的一个或多个字符,您可以执行以下操作:
NO_LOWERCASE : ~('a'..'z')+ ;
(negation-meta-char, ~
, 的优先级高于+
, 所以上面的规则等于(~('a'..'z'))+
)
请注意,'a'..'z'
匹配单个字符(因此可以被否定),但以下规则无效:
ANY_EXCEPT_AB : ~('ab') ;
因为'ab'
(显然)匹配 2 个字符,所以它不能被否定。要匹配包含 2 个字符但不包含 的标记'ab'
,您必须执行以下操作:
ANY_EXCEPT_AB
: 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b'
| ~'a' . // other than 'a' followed by any char
;
解析器规则
在解析器规则中,~
否定某个标记或多个标记。例如,您定义了以下标记:
A : 'A';
B : 'B';
C : 'C';
D : 'D';
E : 'E';
如果您现在要匹配除 之外的任何标记A
,请执行以下操作:
p : ~A ;
如果你想匹配除B
and之外的任何标记D
,你可以这样做:
p : ~(B | D) ;
但是,如果您想匹配除A
后跟之外的任何两个标记B
,则不能:
p : ~(A B) ;
就像词法分析器规则一样,您不能否定多个标记。要完成上述操作,您需要执行以下操作:
P
: A ~B
| ~A .
;
请注意,解析器规则中的.
(DOT) 字符与词法分析器规则中的任何字符都不匹配。在解析器规则中,它匹配任何标记(在本例中为A
、B
、或)。C
D
E
请注意,您不能否定解析器规则。以下是非法的:
p : ~a ;
a : A ;
于 2011-11-27T10:30:46.110 回答