Parsing 如何[“03C0”匹配<;Ada参考手册>';附录P中的语法?

Parsing 如何[“03C0”匹配<;Ada参考手册>';附录P中的语法?,parsing,grammar,ada,identifier,Parsing,Grammar,Ada,Identifier,我正在编写一个工具,用2005年附录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_

我正在编写一个工具,用2005年附录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_声明”。下一条规则是什么?下一条规则呢?下一条规则?直到[“03C0”]可以成功解析为止。最后,问题应该是:解析了哪个规则[“03C0”]?

  • Ada参考手册位于:

    PDF格式的Ada参考手册第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-gnatWbHello.adb”
  • 如果我在代码中使用p,我必须将字符集更改为“UTF-8”,否则GPS将无法识别该字符并提示消息。 在我将其更改为UTF-8之后,我需要使用“gnatmake-gnatW8Hello.adb”进行编译
  • 我试图将[“03C0”]更改为[“abcd”]并再次编译,它将失败,并说“标识符中的宽字符无效”。
    我猜:如果[“03C0”]仅通过语法分析,[“abcd”]也将通过语法检查。 所以从失败的结果和信息来看,我可以说GNAT是这样工作的: 在将源文件发送到语法分析器之前,有一个预处理过程。 预处理将计算unicode值,检查它是否在有效的宽字符集中。 如果它在有效的宽字符集中,它将继续发送到语法分析器。否则,失败
  • 1:请参阅-RM使用正确的unicode字符。你的报价似乎来自GNAT软件包。关于这一点,请参阅关于如何告诉GNAT应该使用哪种编码


    2:手臂没有规则。这是一个编码问题,由实现(GNAT)完成
    [“03C0”]
    (默认为-gnatWb)的处理方式类似于
    π
    (使用-gnatW8)甚至
    Pi
    作为变量名(或在本例中为常量)的有效标识符。

    谢谢,这真的很有帮助。