如何在 Antlr 中指定需要超过四个十六进制数字的 unicode 文字?
How do I specify a unicode literal that requires more than four hex digits in Antlr?
我想为 unicode 字符之间的范围定义一个词法分析器规则,这些字符的代码点需要超过四个十六进制数字才能识别。具体来说,我想声明以下规则:
ID_Continue : [\uE0100-\uE01EF] ;
不幸的是,它不起作用。此规则将匹配不在此范围内的字符。 (我不确定这会导致什么确切的行为,但这不是我想要的。)我还尝试了以下方法(用前导零填充并使用 8 位数字):
ID_Continue : [\U000E0100-\U000E01EF] ;
但它似乎会导致同样的不良行为。
我正在使用 Antlr4 及其 IntelliJ 插件进行测试。
Antlr4 不支持 \uFFFF
以上的 unicode 文字吗?
不,ANTLR 的最大值与 Java 的 Character.MAX_VALUE
相同
如果您查看(部分)ANTLR4's lexer grammar,您将看到这些规则:
// 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 : '\' ;
注意:对 BMP 的限制纯粹是 Java 限制。其他目标可能更进一步。例如 my MySQL grammar,为 ANTLR3(C 目标)编写的可以很容易地 lex 例如来自 BMP 之外的表情符号。这适用于带引号的字符串和标识符。
这里有点奇怪的是我没有在语法中指定该范围(它只使用 BMP)。解析器仍然可以解析任何 utf-8 输入。可能是目标运行时中的错误,但我很高兴它存在 :-D
我想为 unicode 字符之间的范围定义一个词法分析器规则,这些字符的代码点需要超过四个十六进制数字才能识别。具体来说,我想声明以下规则:
ID_Continue : [\uE0100-\uE01EF] ;
不幸的是,它不起作用。此规则将匹配不在此范围内的字符。 (我不确定这会导致什么确切的行为,但这不是我想要的。)我还尝试了以下方法(用前导零填充并使用 8 位数字):
ID_Continue : [\U000E0100-\U000E01EF] ;
但它似乎会导致同样的不良行为。
我正在使用 Antlr4 及其 IntelliJ 插件进行测试。
Antlr4 不支持 \uFFFF
以上的 unicode 文字吗?
不,ANTLR 的最大值与 Java 的 Character.MAX_VALUE
相同如果您查看(部分)ANTLR4's lexer grammar,您将看到这些规则:
// 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 : '\' ;
注意:对 BMP 的限制纯粹是 Java 限制。其他目标可能更进一步。例如 my MySQL grammar,为 ANTLR3(C 目标)编写的可以很容易地 lex 例如来自 BMP 之外的表情符号。这适用于带引号的字符串和标识符。
这里有点奇怪的是我没有在语法中指定该范围(它只使用 BMP)。解析器仍然可以解析任何 utf-8 输入。可能是目标运行时中的错误,但我很高兴它存在 :-D