Что делает следующая строка?
#line 25 "CSSGrammar.y"
А что с расширением?
Что делает следующая строка?
#line 25 "CSSGrammar.y"
А что с расширением?
В соответствии со стандартом:
§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 (слово "грамматика" также указывает на это, хотя это просто предположение).
Он просто заявляет, что текущая строка кода получена из строки 25 файла CSSGrammar.y
, файла грамматики стиля YACC, в котором этот код был сгенерирован.
Это может использоваться отладчиками для входа в грамматику, а не сгенерированного кода.
#line
изменяет позицию отчета для компилятора и используется программным обеспечением для генерации кода, чтобы помочь программисту идентифицировать проблему в исходном источнике. Он может использоваться кем-либо, чтобы помочь перенаправить отчет об ошибках более информативным.
Итак, например, ваш синтаксический анализатор генерирует файл CSSGrammar.cpp, который компилируется компилятором С++, и имеет в нем фрагменты С++, директива #line 25 "CSSGrammar.y"
сообщает компилятору С++ обрабатывать эту конкретную точку в файле, как если бы это строка номер 25 из CSSGrammar.y
Компилятор будет продолжать анализировать последующие строки и сообщать об ошибках в начальных условиях этой директивы.
Итак, если ошибка возникает 3 строки позже, она сообщит, что ошибка произошла в строке 28 в CSSGrammar.y
Обратите внимание, что в одном исходном файле могут быть источники, поступающие из нескольких частей; и что эта директива может быть использована достаточно эффективно для указания условий ошибки.
Обычно вы увидите, что на пути есть несколько директив #line
; они просто должны учитывать различные инъекции на пути (до reset отчетный карет, если хотите).
Обратите внимание, что директива #line может использоваться ANY-генератором, включая ваши собственные, и не ограничивается ими в генераторах синтаксического анализа.
Генератор синтаксического анализатора yacc потребляет файлы, которые заканчиваются на .y, и испускает файлы, содержащие c или С++. Он добавляет эти строки #line, чтобы позволить отладчику вернуться к исходному исходному исходному коду, не принимать никаких замен.
Для компилятора директива полагать, что следующая строка - это строка № 25 в файле CSSGrammar.y
. Затем, если компилятор обнаружит ошибку во 2-й следующей строке, он будет сообщен как строка 26 из CSSGrammar.y
Программы, генерирующие C файлы, такие как bison
, или yacc
, или flex
, или ANTLR, или даже (устаревший) MELT, часто используют эту возможность.
Если генерируется отладочная информация (например, с помощью gcc -g
), она будет указывать на файл CSSGrammar.y
в вашем примере.
это опция препроцессора c. Он сообщает c-parser опустить его количество строк исходного файла, притворяясь, что это строка # 25.
С помощью этой информации вам легче отлаживать исходный файл. Файл yacc будет транслироваться в c-источник, где это искомая строка источника.
Использование #line заставляет компилятор испытывать амнезию в отношении того, какой файл он компилирует и в какой строке он загружает, и загружает новые данные.
Примечание. Компилятор все еще компилируется с той строки, на которой он был.