%locations приводит к мгновенному sigsegv

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

Я добавляю %locations в файл .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      */

person bmargulies    schedule 19.09.2011    source источник


Ответы (1)


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

person Chris Dodd    schedule 19.09.2011
comment
Вопрос отредактирован, чтобы отметить, что вы правы. Затем я попробую вариант с бизонами. - person bmargulies; 20.09.2011