Что означает #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 заставляет компилятор испытывать амнезию в отношении того, какой файл он компилирует и в какой строке он загружает, и загружает новые данные.
Примечание. Компилятор все еще компилируется с той строки, на которой он был.