Unr*_*Sin 0 ada reference-manual
我正在浏览Ada 2012 RM,并希望了解我的理解中是否有漏洞或RM中的漏洞。假如说
put_line ("-- this is a not a comment");
Run Code Online (Sandbox Code Playgroud)
是合法代码,我该如何从RM推论其合法性,因为第2.7节指出“注释以两个相邻的连字符开头,一直延伸到行尾。”而第2.6节指出“ string_literal由一个括在用作字符串括号的两个引号之间的图形字符序列(可能没有)。” 似乎在两个部分之间存在紧张关系,而2.7会获胜,但事实并非如此。
小智 6
为了在此处获得更清晰的了解,您需要查看RM中的2.2节。
2.2(1),其中指出;
每个汇编的文本都是一系列单独的词汇元素。每个词法元素由一系列字符组成,并且可以是定界符,标识符,保留字,numeric_literal,character_literal,string_literal或注释。程序的含义仅取决于构成其编译的词法元素的特定顺序,不包括注释。
和2.2(3/2)指出:
“ [[在某些情况下,需要显式分隔符来分隔相邻的词法元素。]分隔符可以是以下各项中的任意一个:spacer_space空格字符,format_effector格式效果器或行尾:
spacer_space空格字符是分隔符,但注释,string_literal或character_literal除外。
代码点位置为16#09#(字符制表符)的字符字符列表(HT)是分隔符,但注释内除外。
行的结尾始终是分隔符。
在每个编译的第一个之前或最后一个编译之后,在任何两个相邻的词法元素之间允许一个或多个分隔符。”
和
分隔符是以下特殊字符之一:
& ' ( ) * + , – . / : ; < = > |
Run Code Online (Sandbox Code Playgroud)
或以下每个由两个相邻特殊字符组成的复合定界符
=> .. ** := /= >= <= << >> <>
Run Code Online (Sandbox Code Playgroud)
为单个字符定界符列出的每个特殊字符都是单个定界符,除非此字符用作复合定界符的字符,或用作注释,string_literal,character_literal或numeric_literal的字符。
因此,一旦您过滤掉程序文本的空白并将其分解为一系列词法元素,对应于字符串文字的词法元素以双引号字符开头,而对应于注释的词法元素以以下字符开头-。
这些显然是不同的语法项,并且不会相互冲突。
这也解释了为什么;
X := A - -1
+ B;
Run Code Online (Sandbox Code Playgroud)
给出的结果不同于;
X := A --1
+ B;
Run Code Online (Sandbox Code Playgroud)
破折号之间的空格分隔符使第一个减号减去与-1不同的词法元素,因此在第一种情况下,-1是数字文字,而-1是注释。