问题描述
我正在使用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规则中的谓词。