Ada 2012 RM-评论和字符串文字

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是注释。