【问题标题】:Ada 2012 RM - Comments and String LiteralsAda 2012 RM - 注释和字符串文字
【发布时间】:2020-02-07 03:22:09
【问题描述】:

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

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

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

【问题讨论】:

  • 一切都很好,评论以--开头,而字符串以“”开头

标签: ada reference-manual


【解决方案1】:

为了更清楚地了解这里,您需要查看 RM 中的第 2.2 节。

2.2(1),其中规定;

每个编译的文本都是一系列单独的词法元素。每个词法元素由一系列字符组成,可以是定界符、标识符、保留字、numeric_literal、character_literal、string_literal 或注释。程序的含义仅取决于构成其编译的词汇元素的特定序列,不包括 cmets。

而 2.2 (3/2) 规定:

"[在某些情况下,需要显式分隔符来分隔相邻的词法元素。] 分隔符可以是 separator_space 空格字符、format_effector 格式效应器或行尾中的任何一个,如下所示:

separator_space 空格字符是一个分隔符,注释、string_literal 或 character_literal 除外。

码点位置为 16#09# 的字符 (CHARACTER TABULATION) 字符制表 (HT) 是一个分隔符,注释内除外。

行尾始终是分隔符。

在每个编译的第一个之前或最后一个之后,任何两个相邻的词法元素之间都允许有一个或多个分隔符。"

分隔符是以下特殊字符之一:

&    '    (    )    *    +    ,    –    .    /    :    ;    <    =    >    |

或以下复合分隔符之一,每个复合分隔符由两个相邻的特殊字符组成

=>    ..    **    :=    /=    >=    <=    <<    >>    <>

为单个字符定界符列出的每个特殊字符都是单个定界符,除非此字符用作复合定界符的字符,或用作注释、string_literal、character_literal 或 numeric_literal 的字符。

所以,一旦你过滤掉程序文本的空白并将其分解为一系列词法元素,对应于字符串文字的词法元素以双引号字符开头,对应于 a 的词法元素注释以--开头。

这些显然是不同的语法项,并且不会相互冲突。

这也解释了原因;

X := A - -1
      + B;

给出不同的结果;

X := A --1
       + B;

破折号之间的空格分隔符使第一个减号成为与 -1 不同的词法元素,因此 -1 在第一种情况下是数字文字,而--1 是注释。

【讨论】:

  • 所以 2.3 到 2.7 节假定文本已经被解析成它的词法元素。这样就更有意义了。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多