Отчет об ошибках во время выполнения компилятора с указанием местоположения ошибки

0

Я пишу компилятор в C++ (Ubuntu 12.04. С gcc). До сих пор кумулятивная отчетность об ошибках/предупреждениях с довольно точным номером строки и столбца местоположения ошибки/предупреждения работает нормально.

Мои цели проекта включают в себя просто обучение тому, как это сделать, поэтому я добавляю этап предварительной обработки (на первом этапе выполняем только минимальные элементы, такие как конкатенация строк, удаление комментариев и т.д.), Создавая результирующий файл tmp. На данный момент это не понадобится, поскольку я мог бы конкатенировать строки в моем лексере во время разбора, и лексер уже отлично обрабатывает комментарии, но я хотел бы понять, как обращаться с ним эффективно и как можно шире.

Ошибки времени компиляции не являются сложными:
(1) выполнить проверку ошибок (-> ошибки времени компиляции отчета)
(2) если ошибок нет, preprocess → tmp file
(3) запустить парсер и т.д. В файле tmp (который является ошибкой во время компиляции)

Тем не менее, я также сообщаю ошибки во время выполнения с номером строки (например, для проверки границ вне границ для массивов с целыми пределами выражения). Поскольку проверки ошибок будут добавлены к байтовому коду моего ИК при анализе только файла tmp, и этот файл может значительно отличаться от исходного файла (в частности, если мы начнем разрешать вставку в файлы заголовков, скажем), как в Земля, вы можете разумно сообщить об ошибке? Есть ли стандартный трюк, как gcc, скажем, справляется с этим? Тип связанной проверки, конечно, не указан для C; но отчет об ошибках времени выполнения относится, скажем, к динамическому разрешению указателей в иерархии в C++, а gcc получает номера строк просто отлично.

  • 1
    Вы можете проверить наличие ошибок в файле tmp и, в случае обнаружения, сохранить конкретную строку и найти ее в главном файле.
  • 0
    @PawelStawarz: неплохое предложение, но довольно сложное ... включающее в себя немало ре-факторинга моей текущей обработки ошибок) (что, конечно, может произойти в любом случае :)).
Теги:
compiler-construction
runtime

1 ответ

1
Лучший ответ

Вы можете записать информацию о номере линии в свой временный файл, созданный вашим препроцессором, например, " Линейный контроль" cpp.

Препроцессор C сообщает компилятору C о местоположении в исходном коде, откуда появился каждый токен. В настоящее время это всего лишь имя файла и номер строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню