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