我正在编写一个工具来使用 2005 Annex P 中提供的语法解析 Ada 源文件。

  • 通过以下代码,我知道 ["03C0"] 代表“希腊字母 Pi”,但它是合法的变量名吗?
    01 package Ada.Numerics is
    02    Pi : constant := 3.14159_26535_89793_23846_26433_83279_50288_41971_69399_37511;
    03    ["03C0"] : constant := Pi;
    04    e : constant := 2.71828_18284_59045_23536_02874_71352_66249_77572_47093_69996;
    05 end Ada.Numerics;
    
  • 在使用语法解析第 03 行时,我目前来到“basic_declaration”。下一条规则是什么?下一个规则?下一个下一个规则?直到["03C0"]可以成功解析。最终,问题应该是: 解析了哪个规则 ["03C0"]?

  • Ada 引用手册位于:
    http://www.adaic.org/resources/add_content/standards/05rm/RM-Final.pdf

    Ada 引用手册 PDF 文件中的第 702 页 ,页面右下角的第 676 页。 附件 P/3.1
        3.1
        basic_declaration ::=
            type_declaration | subtype_declaration
            | object_declaration | number_declaration
            | subprogram_declaration | abstract_subprogram_declaration
            | null_procedure_declaration | package_declaration
            | renaming_declaration | exception_declaration
            | generic_declaration | generic_instantiation
    

    我已经根据 oenone 的回答做了进一步的调查。
  • 如果我在代码中使用 ["03C0"] ,字符集不需要是"UTF-8",这是有道理的。
    编译时,我需要“gnatmake -gnatWb Hello.adb”。
  • 如果我在代码中使用p,必须将字符集改为“UTF-8”,否则GPS将无法识别该字符并提示信息。
    改成UTF-8后,需要使用“gnatmake -gnatW8 Hello.adb”来编译。
  • 我试图将 更改 ["03C0"] 更改为 ["abcd"] 并再次编译,它会失败,说“标识符中的宽字符无效”。
    我猜:如果 ["03C0"] 仅通过语法解析,["abcd"] 也会通过语法检查。
    因此,从失败结果和消息来看,我可以说,GNAT 以这种方式工作:
    在将源文件发送到语法解析器之前,有一个 预处理
    预处理将评估 unicode 值,检查它是否在有效的宽字符集中。
    如果它在有效的宽字符集内,它将继续发送到语法解析器。否则,失败。
  • 最佳答案

    1:参见 A.5 The Numerics Package - RM 使用正确的 unicode 字符。您的报价似乎来自 GNAT 包。为此,请参阅 GNAT Users Guide 以了解如何告诉 GNAT 它应该使用哪种编码。

    2:没有来自 ARM 的规则。这是一个编码问题,由实现(GNAT)完成。 ["03C0"](使用 -gnatWb,这是默认值)的处理方式与 π(使用 -gnatW8)或什至 Pi 作为变量名(或在这种情况下为常量)的有效标识符一样。

    关于parsing - ["03C0"] 如何匹配附件 P 中<Ada 引用手册> 的语法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7579814/

    10-11 04:30