[“03C0”]如何与附件P中的<ada reference =“”manual =“”>的语法相匹配?</ada>

时间:2011-09-28 07:39:27

标签: parsing grammar ada identifier

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

  1. 下面的代码,我知道 [“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;
    
  2. 当使用语法解析第03行时,我目前来到“basic_declaration”。下一个规则是什么?下一个规则呢?接下来的下一个规则?直到[“03C0”]可以成功解析。最终,问题应该是:解析哪个规则[“03C0”]?

  3. Ada参考手册位于: http://www.adaic.org/resources/add_content/standards/05rm/RM-Final.pdf

    页面右下角的

    Ada参考手册第702页(PDF格式),页面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 的回答做了进一步的调查。

    1. 如果我在代码中使用[“03C0”],则字符集不需要是“UTF-8”,这是有道理的。 编译时,我需要“gnatmake -gnatWb Hello.adb”。
    2. 如果我在代码中使用p,我必须将字符集更改为“UTF-8”,否则GPS将无法识别此字符并提示消息。 在我将其更改为UTF-8后,我需要使用“gnatmake -gnatW8 Hello.adb”进行编译。
    3. 我尝试将[“03C0”]更改为[“abcd”] 并再次编译,它会失败,说“标识符中的宽字符无效”。
      我GUESS:如果只用语法解析[“03C0”],[“abcd”]也会通过语法检查。 因此,从失败的结果和消息,我可以说,GNAT以这种方式工作:            在将源文件发送到语法分析器之前,有一个预处理。         预处理将评估unicode值,检查它是否在有效的宽字符集中。         如果它在有效的宽字符集内,它将继续发送到语法分析器。否则,失败。

1 个答案:

答案 0 :(得分:4)

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

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