在ANTLR词法分析器

时间:2018-03-09 06:29:42

标签: antlr antlr4

我正在尝试在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 ] | [()<>[\]{}/%] )
    ;

1 个答案:

答案 0 :(得分:1)

不,遗憾的是这里没有捷径。您可以单独定义范围,也可以像在编辑中那样取消。