从 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.
中那样取反
我正在尝试在 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.
中那样取反