antlr - 否定内部词法分析器和解析器规则

标签 antlr antlr4 antlr3 parser-generator

如何在 ANTLR 的词法分析器和解析器规则中使用否定元字符 ~

最佳答案

取反可以发生在 lexer and parser rules 内部.

在词法分析器规则内,您可以否定字符,在解析器规则内,您可以否定标记(词法分析器规则)。但是词法分析器和解析器规则都只能分别否定单个字符或单个标记。

几个例子:

词法分析器规则

要匹配除小写 ascii 字母之外的一个或多个字符,您可以执行以下操作:

NO_LOWERCASE : ~('a'..'z')+ ;

(否定元字符 ~ 的优先级高于 +,因此上面的规则等于 (~(' 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 ;

如果你想匹配除BD之外的任何标记,你可以这样做:

p : ~(B | D) ;

但是,如果您想要匹配除 A 后跟 B 之外的任何两个标记,您不能做:

p : ~(A B) ;

就像词法分析器规则一样,您不能否定多个标记。要完成上述任务,您需要执行以下操作:

P
  :  A ~B
  |  ~A .
  ; 

请注意,解析器规则中的 . (DOT) 字符与词法分析器规则中的任何字符匹配。在解析器规则内,它匹配任何标记(ABCDE,在本例中)。

请注意,您不能否定解析器规则。以下内容是非法的:

p : ~a ;
a : A  ;

关于antlr - 否定内部词法分析器和解析器规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284919/

相关文章:

java - 如何指定 ANTLR 中某个 token 出现的确切次数?

java - 如何安装antlr4?

java - ANTLR 语法中的歧义

Antlr4 不匹配复合标记

parsing - 树结构 : propagate a subtree to child

java - 扩展简单的 ANTLR 语法以支持输入变量

ANTLRWorks 警告 'no start rule'

javascript - 自 4.5 版起,ANTLR 无法生成 Javascript 代码

ANTLR4 - 听众比访客更快?

C#、ANTLR4 和命名空间