从 ANTLR 词法分析器中排除范围内的字符

Exclude chars from range in ANTLR lexer

我正在尝试在 ANTLR 中定义一个标记片段。它是 Unicode 范围 !~ 之间的字符序列,但不能包含空格或任何分隔符。

fragment RegularCharRange : '\u0021'..'\u007e' ;

fragment WhitespaceChar : [\u0000\t\n\f\r ] ;

fragment DelimiterChar : [()<>[\]{}/%] ;

以下是无效的 ANTLR 语法,但它表达了我正在尝试做的事情。

fragment RegularChar :  RegularCharRange & ~WhitespaceChar & ~DelimiterChar ;

一旦定义片段,将像这样使用:

Name : '/' RegularChar* ;

我如何构造 RegularChar 规则来保持我的小词法分析器语法的可读性,而不求助于它作为 unicode 范围列表的定义(这也会迫使我学习每个的顺序我的空白字符和定界符,以便它们适合上述范围内的正确位置)?

编辑: 我知道我可以像这样实现正确的行为,但我希望从可重用的片段中构建我的词法分析器规则:

fragment RegularChar
    :  ~( '\u0000'..'\u0020' | '\u007f'..'\uffff' | [\u0000\t\n\f\r ] | [()<>[\]{}/%] )
    ;

不,不幸的是这里没有捷径。您可以单独定义范围,也可以像在 EDIT.

中那样取反