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



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

fragment RegularCharRange : 'u0021'..'u007e' ;
fragment WhitespaceChar : [u0000tnfr ] ;
fragment DelimiterChar : [()<>[]{}/%] ;

以下是无效的 ANTLR 语法,但它表达了我正在尝试执行的操作。

fragment RegularChar :  RegularCharRange & ~WhitespaceChar & ~DelimiterChar ;

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

Name : '/' RegularChar* ;

我如何构建RegularChar规则以保持我的微小词法分析器语法的可读性,而不诉诸其定义为 unicode 范围列表(这也将迫使我学习每个空格和分隔符字符的顺序,以便它们适合上述范围内的正确位置(?

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

fragment RegularChar
    :  ~( 'u0000'..'u0020' | 'u007f'..'uffff' | [u0000tnfr ] | [()<>[]{}/%] )
    ;

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

最新更新