Отладка сгенерированного парсером кода - PullRequest
0 голосов
/ 30 июня 2011

Я сгенерировал код парсера с помощью Lemon Parser. Я не могу отладить сгенерированный код. Элемент управления показывает некоторый другой исходный код, нежели текущий выполняемый оператор. Точки останова смещены. Я пробовал на GDB и Visual C ++. У обоих одна и та же проблема. Пожалуйста, скажите мне способ отладки.

Ответы [ 3 ]

2 голосов
/ 05 января 2013

Допустим, ваш входной файл называется mylexer.y, и в этом случае Lemon сгенерирует myparser.c и myparser.h

Внутри myparser.c вы увидите такие строки, как эта

#line 1 "myparser.y"

Это строковые директивы . Они хороши для отслеживания синтаксических ошибок обратно в файл, который использовался для генерации кода. Они не годятся для отладки.

Чтобы подавить их, вызовите Lemon с опцией -l.

lemon -l myparser.y

Чтобы увидеть другие опции, не упомянутые в документации, используйте -?

lemon -?
1 голос
/ 01 июля 2011

Ниже приведен сертифицированный WAG (Wild Ass Guess):

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

Предыстория: В 80-х годах я разработал и выпустил на рынок отладчик CDB. По мере того, как я переносил его на все, что имело имя U * NX, я хорошо знаком с особенностями различных компиляторов и тем, как они генерировали отладочную информацию в определенных ситуациях.

Одна распространенная проблема была связана с макросами, которые ускользали от них. Э.Г.

#define foo(bar) bar + \
    snort + something_else

x = foo(5);
y = 2;

Если бы номер строки для y = 2; должен был быть равным 5, многие таблицы символов в конечном итоге отображали бы его как 6, и каждая строка после него была бы смещена на единицу. И каждое использование такого макроса будет приводить к удалению номеров строк все дальше и дальше.

0 голосов
/ 30 июня 2011

Проверьте оптимизацию, параметры отладочной информации, если вы создаете их как lib / dll.

...