Я сейчас не за компьютером, поэтому собираюсь ответить на немного другой вопрос: "Как я могу отладить мой анализатор?"
Много это просто здравый смысл, и он применим к любому инструменту или библиотеке, с которыми вы не знакомы. Но есть также некоторые функции Flex и Bison, которые могут быть действительно полезными.
Итак, мы можем начать с самого очевидного совета: иметь под рукой документацию. Вполне возможно, что у вас действительно есть это на вашем компьютере, если вы используете unix -подобную операционную систему. Правильная установка flex и bison должна включать файлы, необходимые для использования инструмента info
. Так что вы можете попробовать набрать
info flex # or info bison
и посмотреть, дает ли это вам руководство. Если нет, вы можете прочитать те же самые документы в Интернете (хотя убедитесь, что ваша версия flex / bison соответствует). Вы найдете их в
Оба эти руководства есть разделы по отладке.
Следующий общий совет: начните с малого и продолжайте свой путь. Не пишите несколько сотен строк кода, используя инструмент, с которым вы не знакомы, и только после этого начинайте тестирование. Начните с самого маленького кусочка, который выполняет то, что вы можете проверить, и проверьте его, прежде чем добавлять дополнительные сложности. Это не только поможет вам решить ваши собственные проблемы; это также поможет вам описать вашу проблему, когда вам нужно обратиться за помощью.
В случае синтаксического анализатора понятно, как начать с малого: начните с лексера и убедитесь, что он разбивает ваш ввод на токены, как и будет ожидать ваша грамматика.
Если вы Если вы собираетесь использовать Flex с Bison, вам нужно написать небольшую часть вашего файла Bison: достаточно, чтобы Bison создал файл заголовка. Для сканеров Flex этот заголовочный файл необходим, поскольку он определяет enum
константы, которые вы будете возвращать анализатору, а также объявляет semanti c type YYSTYPE
и переменную yylval
, используемую для передачи семантики каждого токена * 1066. * ценность. (В руководстве Bison есть целая глава о значениях semanti c, в которой объясняется, как объявлять и использовать значения токенов.)
Вы можете легко протестировать свой лексер, используя флаг -d
для Flex, который будет заставить сгенерированный сканер печатать отладочную информацию для каждого сопоставленного шаблона (независимо от того, возвращает ли сканер токен). Вы можете скомпилировать сканер с помощью -lfl
; эта библиотека включает в себя простой main
, который просто вызывает сканер несколько раз, пока он не сообщит о EOF.
Вы обязательно должны сделать этот шаг, потому что ваш сканер Flex имеет несколько ошибок, которые не связаны с вашим вопросом, но которые приведут к проблемы позже. Вы можете обратиться к главе «Шаблоны» в руководстве по Flex.
После того, как ваш сканер заработает, вы можете начать работу со своим анализатором. Как и Flex, Bison предлагает механизм отладки, который окажется очень полезным. Для его использования требуются лишь очень незначительные изменения:
Сначала добавьте флаг -t
(trace) к вашему вызову Bison. Это будет включать код для генерации трасс отладки. Но вам все равно нужно запустить трассировку.
Добавьте следующее в вашу функцию main()
перед вызовом yyparse
:
#if YYDEBUG
yydebug = 1;
#endif
Проверка препроцессора необходимо, потому что yydebug
не существует, если парсер не был сгенерирован с флагом -t
. Возможно, вы захотите сделать настройку yydebug
условной для флага командной строки или переменной среды, чтобы включить или отключить отладку без перекомпиляции.
Информация об отладке Bison может быть немного сначала ошеломляюще, но это не так сложно. Это поможет иметь под рукой конечный автомат; Bison генерирует текстовую версию, если вы используете флаг -v
. (Он также может нарисовать конечный автомат, используя Graphviz, но кроме игрушечных грамматик с только четырьмя или пятью производствами, графика c в основном непригодна.)