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 - комментарием.