Грамматика бизонов: yylval встроен в yyparse - PullRequest
1 голос
/ 11 мая 2011

Не удивительно, что я не могу ссылаться на него из моего гибкого файла. Я проверил это и вынул объявление "YYSTYPE yylval;" с начала yyparse, и он работает как задумано. Конечно, это не правильный способ использования зубров и гибких? Может кто-нибудь показать мне другой путь? Спасибо.

Ответы [ 3 ]

1 голос
/ 20 ноября 2012

Вместо использования

#define YY_DECL int yylex(YYSTYPE *val)

Вы также можете использовать

%option bison-bridge

Но если вы хотите написать синтаксический анализатор flex + bison на C ++, то этот метод не работает.

Для синтаксических анализаторов C ++ отметьте в этом примере out.

1 голос
/ 11 мая 2011

Обычно yylval объявляется и определяется в файле y.tab.c, выводимом bison. Он также объявлен (как extern) в файле y.tab.h, поэтому, если вы включите его в свой лексер, вы можете получить доступ к yylval как к глобальной переменной. Это нормальный способ работы flex / bison, и нет необходимости редактировать файлы, чтобы вынуть вещи - он должен просто работать

Это использование глобальной переменной вызывает проблемы, если вы хотите иметь более одного парсера в программе или хотите использовать несколько парсеров в разных потоках (или иным образом одновременно). Bison предоставляет способ избежать этого с помощью %define api.pure, который избавляет от yylval как глобального - вместо этого парсер будет вызывать yylex с адресом YYSTYPE (указатель), и лексер должен поместить туда значение токена, а не в yylval. Если вы используете flex, вам нужно, чтобы #define YY_DECL int yylex(YYSTYPE *val) в верхней части вашего файла flex изменило объявление, используемое для yylex.

0 голосов
/ 12 мая 2011

Я проверил это и вынул объявление "YYSTYPE yylval;"

Интересно, что-то не так с вашим "вынутым", но вы можете попробовать

bison -d your-yacc-file.y

, тогда bison сгенерирует для вас заголовочный файл со всеми этими объявлениями.

...