嗨,伙计们,我正在开发一个带有 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 指令的一种)。