如何在Antlr中指定需要四个以上十六进制数字的unicode文字?

时间:2016-03-11 10:50:33

标签: unicode antlr antlr4 lexical-analysis unicode-literals

我想为unicode字符之间的范围定义词法分析器规则,这些字符的代码点需要多于四个十六进制数字才能识别。具体来说,我想宣布以下规则:

ID_Continue : [\uE0100-\uE01EF] ;

不幸的是,它不起作用。此规则将匹配不在此范围内的字符。 (我不确定这会产生什么样的确切行为,但它不是我想要的。)我还尝试了以下内容(使用前导零填充并使用8位数字):< / p>

ID_Continue : [\U000E0100-\U000E01EF] ;

但它似乎导致了同样的不良行为。

我正在使用Antlr4和IntelliJ插件进行测试。

Antlr4不支持\uFFFF以上的unicode文字吗?

2 个答案:

答案 0 :(得分:2)

不,ANTLR的最大值与Java的Character.MAX_VALUE

相同

如果你看一下({3}}的一部分,你会看到这些规则:

// Any kind of escaped character that we can embed within ANTLR literal strings.
fragment EscSeq
    :   Esc
        ( [btnfr"'\\]   // The standard escaped character set such as tab, newline, etc.
        | UnicodeEsc    // A Unicode escape sequence
        | .             // Invalid escape character
        | EOF           // Incomplete at EOF
        )
    ;

...

fragment UnicodeEsc
    :   'u' (HexDigit (HexDigit (HexDigit HexDigit?)?)?)?
    ;

...

fragment Esc : '\\' ;

答案 1 :(得分:0)

注意:对BMP的限制纯粹是Java限制。其他目标可能会更进一步。例如my MySQL grammar,为ANTLR3(C目标)编写的内容很容易来自BMP之外的表情符号。这适用于带引号的字符串以及IDENTIFIER。

enter image description here

然而,这里有点奇怪的是我没有在语法中指定范围(它只使用BMP)。解析器仍然可以解析任何utf-8输入。可能是目标运行时中的错误,但我很高兴它存在:-D