在Antlr 4 C ++目标中编写UTF-16标识符字符的语法

问题描述

我正在使用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 ++目标中运行?

解决方法

问题

操作代码块?之后的问号{action code}是什么?

我从antlr4 documentation找到了答案:

{«p»}?评估语义谓词«p»。如果«p»在运行时评估为false,则周围的规则将变为“不可见”(不可行)。表达式“ p”符合目标语言的语法。虽然语义谓词可以出现在词法分析器规则内的任何位置,但将其置于规则末尾是最有效的。一个警告是语义谓词必须在词法分析器动作之前。请参阅Lexer规则中的谓词。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...