Попытка построить ваш код дает мне следующие ошибки:
main.c: In function ‘parse_string’:
main.c:27:5: warning: implicit declaration of function ‘yy_switch_to_buffer’ [-W
implicit-function-declaration]
yy_switch_to_buffer(yy_scan_string(str));
^~~~~~~~~~~~~~~~~~~
main.c:27:25: warning: implicit declaration of function ‘yy_scan_string’ [-Wimplicit-function-declaration]
yy_switch_to_buffer(yy_scan_string(str));
Это означает, что компилятор предполагает, что yy_switch_to_buffer()
и yy_scan_string()
возвращают int
, так какделает для всех функций, которые не объявлены перед использованием (согласно стандарту c89).Но это не так (первый возвращает void
, а второй - указатель (YY_BUFFER_STATE
)).Обратите внимание, что в x86_64 размер указателя не совпадает с размером int
.
Добавление некоторых прототипов пластыря, таких как
void yy_switch_to_buffer(void*);
void *yy_scan_string(const char*);
до main.c
, прежде чем их использование в parse_string()
может остановить сегфагинг.
Лучшим решением было бы организовать в Makefile запуск лексера с опцией --header-file=lex-header.h
, а затем включить lex-header.h
от main.c
.Или, что еще лучше, оберните весь специфичный для lex код в несколько простых функций и поместите прототипы этих функций в заголовок, включенный как в файл main.c
, так и в файл *.l
.