【发布时间】:2020-09-01 08:55:32
【问题描述】:
我正在使用用 Antlr 4 编写的 this PostgreSQL grammar 来生成 C++ 目标解析器。
它有一些用 Java 编写的动作代码,所以我需要将它转换为 C++ 以便它能够编译。
下面的代码我没看懂意思:
fragment
IdentifierStartChar
: // these are the valid identifier start characters below 0x7F
[a-zA-Z_]
| // these are the valid characters from 0x80 to 0xFF
[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]
| // these are the letters above 0xFF which only need a single UTF-16 code unit
[\u0100-\uD7FF\uE000-\uFFFF] {Character.isLetter((char)_input.LA(-1))}?
| // letters which require multiple UTF-16 code units
[\uD800-\uDBFF] [\uDC00-\uDFFF] {Character.isLetter(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
;
动作代码块{action code}后面的问号?有什么作用? (编辑:在下面回答自己)
这似乎是对 UTF-16 编码的标识符字符的某种字母识别。
我正在寻找 Character.isLetter() 和 Character.toCodePoint() 的 C++ 替代品。这是正确的方法吗? Antlr 4 C++ 目标的工作方式是否与 Java 相同,所以我只需要交换函数吗?
或者,如何修改上面的代码,使其可以在 C++ 目标中运行?
【问题讨论】:
标签: java c++ antlr antlr4 utf-16