SIGSEGV在创建解析器树时

时间:2018-01-24 05:51:16

标签: c++ compiler-construction bison lex

我正在尝试使用flex / bison创建一个解析器生成器。这是我的部分parser.y代码:

func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement
                 {
                    $$=new Symbol_info();
                    $$->code+="PROC:"+ $2->symbol+"\n";

                    if($2->symbol!="main")
                    {
                        $$->code+="PUSH AX\n";
                        $$->code+="PUSH BX\n";
                        $$->code+="PUSH CX\n";
                        $$->code+="PUSH DX\n";
                    }

                    $$->code += $6->code ;

                    if($2->symbol!="main") {
                        $$->code+="POP DX\n";
                        $$->code+="POP CX\n";
                        $$->code+="POP BX\n";
                        $$->code+="POP AX\n";
                    }

                    fprintf(parseLog, "GRAMMER RULE: func_definition -> type_specifier ID LPAREN parameter_list RPAREN compound_statement  \n"); 
                 }
                ;

这是我的部分lex.l代码。

{id} {
    Symbol_info *s= new  Symbol_info(yytext, "ID");
    yylval = (YYSTYPE)s;

    return ID;
}

这是我的部分symbol_table.h代码

class SymbolInfo{
    string type;
    string symbol;
public:
    string code;
    SymbolInfo *next;


    SymbolInfo(){
        symbol="";
        type="";
        code="";
    }
    SymbolInfo(string symbol, string type){
        this->symbol=symbol;
        this->type=type;
        code="";
    }
    SymbolInfo(char *symbol, char *type){
        this->symbol=string(symbol);
        this->type= string(type);
        code="";
    }

    SymbolInfo(const SymbolInfo *sym){
        symbol=sym->symbol;
        type=sym->type;
        code=sym->code;
    }

因此,当我创建一个程序时,我得到一个SIGSEGV分段错误。 (地址边界错误)。当我尝试访问lex函数返回给我的yylval时,我似乎得到了这个错误。

1 个答案:

答案 0 :(得分:0)

我试图在Ubuntu 64位实例(Ubuntu 17.10)上运行此代码。我不知道为什么,但相同的代码在32位系统上运行良好(Ubuntu 14.10)。

也许是因为整数大。 Here is the code如果您有兴趣。