我正在编写一个工具来使用 2005 Annex P 中提供的语法解析 Ada 源文件。
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;
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 的回答做了进一步的调查。
编译时,我需要“gnatmake -gnatWb Hello.adb”。
改成UTF-8后,需要使用“gnatmake -gnatW8 Hello.adb”来编译。
我猜:如果 ["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/