1

我正在浏览 Ada 2012 RM,想看看我的理解是否存在漏洞或 RM 中是否存在漏洞。假如说

    put_line ("-- this is a not a comment");

是合法代码,我如何从 RM 中推断其合法性,因为第 2.7 节指出“注释以两个相邻的连字符开头并延伸到行尾。”,而第 2.6 节指出“string_literal 由括在用作字符串括号的两个引号之间的图形字符序列(可能没有)。” 两个部分之间似乎存在紧张关系,并且 2.7 会获胜,但显然情况并非如此。

4

1 回答 1

6

为了更清楚地了解这里,您需要查看 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 是注释。

于 2019-10-10T00:47:03.353 回答