代码之家  ›  专栏  ›  技术社区  ›  Simone Margaritelli

使用Flex和Bison在脚本引擎中实现eval和load函数

  •  1
  • Simone Margaritelli  · 技术社区  · 16 年前

    嘿,伙计们,我现在正在用flex和bison开发一个脚本引擎 举个例子,语法如下:

    import std.*;
    
    load( "some_script.hy" );
    
    eval( "foo = 123;" );
    
    println( foo );
    

    因此,在我的lexer中,我实现了以下功能:

    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代码生成的,

    1 回复  |  直到 13 年前
        1
  •  1
  •   Chris Dodd    16 年前

    这个错误似乎表明 YY_CURRENT_BUFFER yypop_buffer_state 弹出最后一个输入缓冲区。如果你在一个小时内这样做 <<EOF>> 规则(例如,处理您所说的已实现的include指令),您需要检查 YY_电流_缓冲器 yyterminate ,否则它会像你看到的那样崩溃。

    西蒙妮,我不确定我是否理解你的评论。如果你有 <<EOF>&燃气轮机; hyb_parse_string (在 yyparse 呼叫)你发布的功能?使用gdb的 bt << 规则行动?