Привет, ребята, я разрабатываю скриптовый движок с помощью flex и bison, и теперь я реализую функции eval и load для этого языка. Просто чтобы дать вам пример, синтаксис выглядит так:
import std.*;
load( "some_script.hy" );
eval( "foo = 123;" );
println( foo );
Итак, в моем лексере я реализовал функцию:
void hyb_parse_string( const char *str ){
extern int yyparse(void);
YY_BUFFER_STATE prev, next;
/*
* Save current buffer.
*/
prev = YY_CURRENT_BUFFER;
/*
* yy_scan_string will call yy_switch_to_buffer.
*/
next = yy_scan_string( str );
/*
* Do actual parsing (yyparse calls yylex).
*/
yyparse();
/*
* Restore previous buffer.
*/
yy_switch_to_buffer(prev);
}
Но, похоже, это не работает. Что ж, это так, но когда строка (загруженная из файла или непосредственно оцененная) завершена, я получаю sigsegv :
Program received signal SIGSEGV, Segmentation fault.
0xb7f2b801 in yylex () at src/lexer.cpp:1658
1658 if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
Как вы могли заметить, sigsegv генерируется кодом flex/bison, а не моим... какие-нибудь подсказки или, по крайней мере, какие-нибудь примеры того, как реализовать такие функции?
PS: я успешно реализовал директиву include, но мне нужно, чтобы eval и load работали не во время синтаксического анализа, а во время выполнения (вроде директив PHP include/require).