[содержание] [назад] [пред] [вверх] [след] [вперед] 9. отладка вашего анализатора
если грамматика bison компилируется правильно, но при запуске делает не то,
чего вы хотите, помочь вам выяснить, почему это происходит, может средство
трассировки анализатора
чтобы включить компиляцию возможностей трассировки, вы должны определить
макрос
средство трассировки выводит собщения, используя макровызовы вида
после того, как вы скомпилировали программу с использованием средств
трассировки, чтобы потребовать выполнения трассировки, нужно поместить
ненулевое значение в переменную
каждый шаг, предпринимаемый анализатором, когда
для осмысления этой информации полезно обратиться к файлу листинга, выдаваемому параметром bison `-v' (см. раздел 10. вызов bison). этот файл показывает смысл каждого состояния в терминах позиций в различных правилах, а также, что будет происходить в каждом состоянии при каждой возможной входной лексеме. читая последовательные сообщения трассировки, вы можете видеть, что анализатор функционирует в соответствии с его спецификацией в файле листинга. в конце концов вы дойдёте до места, где происходит что-либо нежелательное, и увидите, какие части грамматики несут за это ответственность. файл анализатора -- это программа на c, и вы можете использовать отладчики c, но объяснить, что она делает непросто. функция анализатора -- это интерпретатор машины с конечным числом состояний, и за пределами действий она выполняет один и тот же код снова и снова. в каком месте грамматики она работает, показывают только значения переменных.
отладочная информация обычно содержит тип каждой прочитанной лексемы, но не
её семантическое значение. вы можете также определить макрос
приведём пример #define yyprint(file, type, value) yyprint (file, type, value) static void yyprint (file *file, int type, yystype value) { if (type == var) fprintf (file, " %s", value.tptr->name); else if (type == num) fprintf (file, " %d", value.val); } [содержание] [назад] [пред] [вверх] [след] [вперед] |