我正在尝试在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 中那样否定范围。