Что означает #line?

Что делает следующая строка?

#line 25 "CSSGrammar.y"

А что с расширением?

Ответ 1

В соответствии со стандартом:

§16.4.3:

Директива предварительной обработки формы

# line digit-sequence new-line

приводит к тому, что реализация ведет себя так, как если бы следующая строка исходных строк начиналась с исходной строки который имеет номер строки, как указано в цифровой последовательности (интерпретируется как десятичное целое число). Если цифра последовательность задает нуль или число больше, чем 2147483647, поведение undefined.

§16.4.4:

Директива предварительной обработки формы

# line digit-sequence " s-char-sequenceopt" new-line

задает предполагаемый номер строки аналогично и изменяет предполагаемое имя исходного файла на содержимое символьного строкового литерала.

§16.4.5:

Директива предварительной обработки формы

# line pp-tokens new-line

(который не соответствует одной из двух предыдущих форм). Знаки предварительной обработки после строки в директиве обрабатываются так же, как и в обычном тексте (каждый идентификатор, определенный в настоящее время как имя макроса, заменяется его списком заметок для токенов предварительной обработки). Если директива, полученная после всех замен не соответствует одной из двух предыдущих форм, поведение undefined; в противном случае результат обрабатывается при необходимости.

Расширение .y - это то, что автор решил использовать, возможно, чтобы было очевидно, что это файл YACC (слово "грамматика" также указывает на это, хотя это просто предположение).

Ответ 2

Он просто заявляет, что текущая строка кода получена из строки 25 файла CSSGrammar.y, файла грамматики стиля YACC, в котором этот код был сгенерирован.

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

Ответ 3

Директива

#line изменяет позицию отчета для компилятора и используется программным обеспечением для генерации кода, чтобы помочь программисту идентифицировать проблему в исходном источнике. Он может использоваться кем-либо, чтобы помочь перенаправить отчет об ошибках более информативным.

Итак, например, ваш синтаксический анализатор генерирует файл CSSGrammar.cpp, который компилируется компилятором С++, и имеет в нем фрагменты С++, директива #line 25 "CSSGrammar.y" сообщает компилятору С++ обрабатывать эту конкретную точку в файле, как если бы это строка номер 25 из CSSGrammar.y

Компилятор будет продолжать анализировать последующие строки и сообщать об ошибках в начальных условиях этой директивы.

Итак, если ошибка возникает 3 строки позже, она сообщит, что ошибка произошла в строке 28 в CSSGrammar.y

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

Обычно вы увидите, что на пути есть несколько директив #line; они просто должны учитывать различные инъекции на пути (до reset отчетный карет, если хотите).

Обратите внимание, что директива #line может использоваться ANY-генератором, включая ваши собственные, и не ограничивается ими в генераторах синтаксического анализа.

Ответ 4

Генератор синтаксического анализатора yacc потребляет файлы, которые заканчиваются на .y, и испускает файлы, содержащие c или С++. Он добавляет эти строки #line, чтобы позволить отладчику вернуться к исходному исходному исходному коду, не принимать никаких замен.

Ответ 5

Для компилятора директива полагать, что следующая строка - это строка № 25 в файле CSSGrammar.y. Затем, если компилятор обнаружит ошибку во 2-й следующей строке, он будет сообщен как строка 26 из CSSGrammar.y

Программы, генерирующие C файлы, такие как bison, или yacc, или flex, или ANTLR, или даже (устаревший) MELT, часто используют эту возможность.

Если генерируется отладочная информация (например, с помощью gcc -g), она будет указывать на файл CSSGrammar.y в вашем примере.

Ответ 6

это опция препроцессора c. Он сообщает c-parser опустить его количество строк исходного файла, притворяясь, что это строка # 25.

С помощью этой информации вам легче отлаживать исходный файл. Файл yacc будет транслироваться в c-источник, где это искомая строка источника.

Ответ 7

Использование #line заставляет компилятор испытывать амнезию в отношении того, какой файл он компилирует и в какой строке он загружает, и загружает новые данные.

Примечание. Компилятор все еще компилируется с той строки, на которой он был.