[ Содержание ] [ Предыдущая ] [ Следующая ]

Глава 8. Среда работы Yacc-а

    Когда пользователь создает спецификацию Yacc-а, выходом является файл программы на C, называемый в большинстве реализаций yytab.c (из-за локальных соглашений об именах файлов имена могут различаться от реализации к реализации). Функция, произведенная Yacc-ом, называется yyparse; это функция типа int. Когда она вызывается, то в свою очередь постоянно вызывает yylex, лексический анализатор, предоставляемый пользователем (см. главу 3) для получения входных токенов. В конце концов либо обнаруживается ошибка - в этом случае (если невозможно восстановление после ошибки) yyparse возвращает значение 1, или лексический анализатор возвращает токен конца ввода и парсер совершает действие "принять". В этом случае yyparse возвращает значение 0.

    Пользователь должен обеспечить определеную среду для парсера, чтобы получить работающую программу. Hапример, в каждой программе на C должна быть определена функция main, которая в конечном счете вызывает yyparse. Вдобавок, процедура yyerror печатает сообщение при обнаружении синтаксической ошибки.

    Эти две процедуры должны быть в той или иной форме предоставлены пользователем. Чтобы уменьшить начальные усилия при использовании Yacc-а, предоставляется библиотека с версиями main и yyerror. Имя этой библиотеки различно вразных реализациях; она может совсем отсутствовать (на многих системах библиотека становится доступна с помощью аргумента -ly загрузчика). Чтобы показать тривиальность этих программ по умолчанию, ниже приводится их исходный текст:

main() { return( yyparse() ); }

    и

#include yyerror(char *s) { fprintf( stderr, "%s\n", s ); }

    Аргумент yyerror есть строка, содержащая сообщение об ошибке, обычно строка "syntax error". Обычное приложение захочет большего. Обычно программа должна следить за номером входной строки и печатать ее вместе с сообщением, когда обнаружена синтаксическая ошибка. Внешняя переменная yychar типа int содержит номер LA-токена в тот момент, когда обнаружена ошибка; это может иметь некоторый интерес для выдачи лучшей диагностики. Так как программа main, вероятно, написана пользователем (для чтения аргументов и т.д.), библиотека Yacc-а полезна только в маленьких проектах или на первых шагах больших.

    Внешняя переменная yydebug типа int обычно установлена в 0. Если она установлена в ненулевое значение, парсер выдаст словесное описание своих действий, включая обсуждение того, какие входные символы были прочитаны и каковы действия парсера. В зависимости от операционной среды можно устанавливать эту переменную, используя систему отладки.

[ Содержание ] [ Предыдущая ] [ Следующая ]



c 1998-2000 SoloTony (Antonio Solo) solotony@mail.ru