SIGSEGV 在创建解析器树时
SIGSEGV while creating a parser-tree
我正在尝试使用 flex/bison 创建解析器生成器。这是我的部分 parser.y 代码:
func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement
{
$$=new Symbol_info();
$$->code+="PROC:"+ ->symbol+"\n";
if(->symbol!="main")
{
$$->code+="PUSH AX\n";
$$->code+="PUSH BX\n";
$$->code+="PUSH CX\n";
$$->code+="PUSH DX\n";
}
$$->code += ->code ;
if(->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
时,似乎出现了该错误。
我试图在 Ubuntu 64 位实例 (Ubuntu 17.10) 上 运行 这段代码。我不知道为什么,但相同的代码 运行 在 32 位系统 (Ubuntu 14.10) 上没问题。
可能是因为整数的大小。 Here is the code如果你有兴趣。
我正在尝试使用 flex/bison 创建解析器生成器。这是我的部分 parser.y 代码:
func_definition : type_specifier ID LPAREN parameter_list RPAREN compound_statement
{
$$=new Symbol_info();
$$->code+="PROC:"+ ->symbol+"\n";
if(->symbol!="main")
{
$$->code+="PUSH AX\n";
$$->code+="PUSH BX\n";
$$->code+="PUSH CX\n";
$$->code+="PUSH DX\n";
}
$$->code += ->code ;
if(->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
时,似乎出现了该错误。
我试图在 Ubuntu 64 位实例 (Ubuntu 17.10) 上 运行 这段代码。我不知道为什么,但相同的代码 运行 在 32 位系统 (Ubuntu 14.10) 上没问题。
可能是因为整数的大小。 Here is the code如果你有兴趣。