3

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

ID_Continue : [\uE0100-\uE01EF] ;

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

ID_Continue : [\U000E0100-\U000E01EF] ;

但这似乎会导致相同的不良行为。

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

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

4

2 回答 2

3

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

如果您查看(部分)ANTLR4 的词法分析器语法,您将看到以下规则:

// 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 : '\\' ;
于 2016-03-11T11:46:33.033 回答
0

注意:对 BMP 的限制纯粹是 Java 限制。其他目标可能会走得更远。例如,为 ANTLR3(C 目标)编写的我的 MySQL 语法可以轻松地从 BMP 之外的 lex 例如表情符号。这适用于带引号的字符串以及标识符。

在此处输入图像描述

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

于 2016-03-12T10:21:44.780 回答