皆さん、私は 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 ディレクティブの実装に成功しましたが、解析時ではなく実行時 (PHP の include/require ディレクティブのようなもの) で機能するには、eval と load が必要です。