1

皆さん、私は 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 が必要です。

4

1 に答える 1

1

そのエラーは、YY_CURRENT_BUFFERが無効であることを示しているように見えます。おそらく null です。yypop_buffer_stateこれは、最後の入力バッファをポップするために呼び出した場合に発生します。ルールでそれを行う場合<<EOF>>(たとえば、実装したと言うように include ディレクティブを処理する場合)、確認する必要がありYY_CURRENT_BUFFER、null の場合は を呼び出しますyyterminate。そうでない場合は、ご覧のようにクラッシュします。

編集

シモーネ、あなたのコメントを理解しているかどうかわかりません。ルールがある場合<<EOF>>、そのアクションは yyterminate() を呼び出すか、何らかの方法で新しい入力ソースを確立する必要があります。そうしないと、報告したものと同様のクラッシュが発生します。クラッシュが表示された場合、それは投稿したhyb_parse_string(yyparse呼び出し中の) 関数にありますか? btスタック トレースを表示するには、gdb のコマンドを使用します。あなたの<<EOF>>ルールアクションは何ですか?

于 2010-05-19T03:22:16.637 に答える