【问题标题】:writing the grammar for UTF-16 identifier character in Antlr 4 C++ target在 Antlr 4 C++ 目标中编写 UTF-16 标识符字符的语法
【发布时间】: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


    【解决方案1】:

    问题

    动作代码块{action code}后面的问号?有什么作用?

    我从antlr4 documentation找到答案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2012-10-12
      • 1970-01-01
      • 2013-05-13
      • 2014-01-19
      • 2010-10-16
      • 2013-08-17
      相关资源
      最近更新 更多