Ada 2012 RM - Комментарии и строковые литералы

Я путешествую по Ada 2012 RM и хотел бы увидеть, есть ли дыра в моем понимании или дыра в RM. При условии, что

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

является юридическим кодом, как я могу вывести его законность из RM, поскольку в разделе 2.7 говорится, что "комментарий начинается с двух соседних дефисов и продолжается до конца строки.", а в разделе 2.6 говорится, что "string_literal формируется из последовательность графических символов (возможно, без них), заключенная между двумя кавычками, используемая как строковые скобки ". Кажется, что между этими двумя разделами есть напряжение, и 2.7 победит, но, видимо, это не так.

1 ответ

Решение

Чтобы получить более четкое понимание здесь, вам нужно взглянуть на раздел 2.2 в RM.

2.2 (1), в котором говорится;

Текст каждой компиляции представляет собой последовательность отдельных лексических элементов. Каждый лексический элемент формируется из последовательности символов и является либо разделителем, либо идентификатором, либо зарезервированным словом, numeric_literal, character_literal, string_literal или комментарием. Значение программы зависит только от конкретных последовательностей лексических элементов, образующих ее компиляции, исключая комментарии.

И 2.2 (3/2), в котором говорится:

"[В некоторых случаях явный разделитель требуется для разделения смежных лексических элементов.] Разделитель - это любой из пробела separator_space, эффектора формата format_effector или конца строки, как показано ниже:

Пробел separator_space является разделителем, за исключением комментария, string_literal или character_literal.

Символ с позицией кодовой точки 16#09# (ТАБЛИЦА СИМВОЛОВ) Табуляция символов (HT) является разделителем, за исключением комментария.

Конец строки всегда является разделителем.

Допускается использование одного или нескольких разделителей между любыми двумя соседними лексическими элементами перед первым в каждой компиляции или после последнего."

а также

Разделитель - это один из следующих специальных символов:

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

или один из следующих составных разделителей, каждый из которых состоит из двух смежных специальных символов

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

Каждый из специальных символов, перечисленных для односимвольных разделителей, является одним разделителем, за исключением случаев, когда этот символ используется как символ составного разделителя или как символ комментария, string_literal, character_literal или numeric_literal.

Итак, как только вы отфильтруете пробелы в тексте программы и разберете их на последовательность лексических элементов, лексический элемент, соответствующий строковому литералу, начинается с символа двойной кавычки, а лексический элемент, соответствующий комментарию, начинается с -.

Это явно разные элементы синтаксиса, и они не противоречат друг другу.

Это также объясняет, почему;

X := A - -1
      + B;

дает другой результат, чем;

X := A --1
       + B;

Разделитель пробела между дефисами делает первый минус другим лексическим элементом, чем -1, поэтому -1 является числовым литералом в первом случае, а -1 - комментарием.

Другие вопросы по тегам