% местоположений приводит к мгновенному сигсегв - PullRequest
0 голосов
/ 20 сентября 2011

Я смотрю на парсер, созданный с помощью flex и bison. Бизон 2.5.

Я добавляю% местоположений в файл .y, перекомпилирую и пытаюсь запустить, я награждаюсь sigsegv (ну, эквивалент macosx):

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x000000010003f123
0x000000010003f38c in yylex (yylval_param=0x7fff5fbff5e8, yyscanner=0x7fff5fbff5d0) at     lex.yy.c:2036
2036            *yy_cp = yyg->yy_hold_char;

Все это сгенерированный код, поэтому я не знаю, куда идти в первую очередь, чтобы понять, как yy_cp указывает на хранилище только для чтения.

Обратите внимание, что источник лексера включает

%option noinput
%option reentrant bison-bridge

и источник парсера включает

%lex-param   {yyscan_t *scanner } /* Call flex functions with this argument      */

1 Ответ

1 голос
/ 20 сентября 2011

Похоже, вы используете дополнительные аргументы с yylex, возможно, через %option bison-bridge в лексере и %lex-param и / или %define api.pure в файле зубров.Поэтому, если вы добавите %locations в файл Bison, вам необходимо внести соответствующие изменения в файл Flex.Это может быть так же просто, как просто добавить %option bison-locations, или может потребоваться изменение различных макросов, в зависимости от того, что вы делаете.

...