我正在编写一个工具来使用 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_declaration”。下一条规则是什么?下一个规则呢?下一个下一个规则?直到[“03C0”]能够成功解析。最终,问题应该是:哪个规则解析了 [“03C0”]?
Ada 参考手册位于:http://www.adaic.org/resources/add_content/standards/05rm/RM-Final.pdf 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的回答。
- 如果我在代码中使用[“03C0”],则字符集不需要是“UTF-8”,这是有道理的。
编译时,我需要“gnatmake-gnatWb你好.adb”。
- 如果我在代码中使用p,我必须将字符集更改为“UTF-8”,否则GPS将无法识别该字符并提示消息。
当我将其更改为UTF-8后,我需要使用“gnatmake-gnatW8Hello.adb”进行编译。
- 我尝试过了将 ["03C0"] 更改为 ["abcd"]再次编译,它会失败,提示“标识符中的宽字符无效”。
我猜:如果[“03C0”]仅通过语法解析,[“abcd”]也将通过语法检查。
所以从失败结果和消息来看,我可以说,GNAT 是这样工作的:
有一个预处理在将源文件发送到语法解析器之前。
预处理将评估 unicode 值,检查它是否在有效的宽字符集中。
如果它在有效的宽字符集中,它将继续发送到语法解析器。否则,失败。
1: see A.5 数值包 http://www.adaic.org/resources/add_content/standards/05rm/html/RM-A-5.html- RM 使用正确的 unicode 字符。您的引用似乎来自 GNAT 包。为此,请参阅GNAT 用户指南 http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Character-Set-Control.html#Character-Set-Control关于如何告诉 GNAT 它应该使用哪种编码。
2:ARM 没有规则。这是一个编码问题,是由实现(GNAT)完成的。["03C0"]
(使用-gnatWb,这是默认值)的处理方式如下π
(与-gnatW8)甚至Pi
作为变量名(或在本例中为常量)的有效标识符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)