我正在尝试使用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
时,我似乎得到了这个错误。
答案 0 :(得分:0)
我试图在Ubuntu 64位实例(Ubuntu 17.10)上运行此代码。我不知道为什么,但相同的代码在32位系统上运行良好(Ubuntu 14.10)。
也许是因为整数大。 Here is the code如果您有兴趣。