Я пишу компилятор в C++ (Ubuntu 12.04. С gcc). До сих пор кумулятивная отчетность об ошибках/предупреждениях с довольно точным номером строки и столбца местоположения ошибки/предупреждения работает нормально.
Мои цели проекта включают в себя просто обучение тому, как это сделать, поэтому я добавляю этап предварительной обработки (на первом этапе выполняем только минимальные элементы, такие как конкатенация строк, удаление комментариев и т.д.), Создавая результирующий файл tmp. На данный момент это не понадобится, поскольку я мог бы конкатенировать строки в моем лексере во время разбора, и лексер уже отлично обрабатывает комментарии, но я хотел бы понять, как обращаться с ним эффективно и как можно шире.
Ошибки времени компиляции не являются сложными:
(1) выполнить проверку ошибок (-> ошибки времени компиляции отчета)
(2) если ошибок нет, preprocess → tmp file
(3) запустить парсер и т.д. В файле tmp (который является ошибкой во время компиляции)
Тем не менее, я также сообщаю ошибки во время выполнения с номером строки (например, для проверки границ вне границ для массивов с целыми пределами выражения). Поскольку проверки ошибок будут добавлены к байтовому коду моего ИК при анализе только файла tmp, и этот файл может значительно отличаться от исходного файла (в частности, если мы начнем разрешать вставку в файлы заголовков, скажем), как в Земля, вы можете разумно сообщить об ошибке? Есть ли стандартный трюк, как gcc, скажем, справляется с этим? Тип связанной проверки, конечно, не указан для C; но отчет об ошибках времени выполнения относится, скажем, к динамическому разрешению указателей в иерархии в C++, а gcc получает номера строк просто отлично.
Вы можете записать информацию о номере линии в свой временный файл, созданный вашим препроцессором, например, " Линейный контроль" cpp
.
Препроцессор C сообщает компилятору C о местоположении в исходном коде, откуда появился каждый токен. В настоящее время это всего лишь имя файла и номер строки.