我知道有人问过类似的问题,但我无法根据我所看到的来确定为什么我会得到这个错误。
这是回溯:
SymbolStack的定义(在Symbols.h中):
#ifndef HW3_SYMBOLS_H
#define HW3_SYMBOLS_H
#include <string>
#include <vector>
#include <iostream>
#include "shared_def.h"
using std::vector; using std::string;
extern int yylineno;
...
class SymbolStack {
public:
vector<int> pos_stack = vector<int>();
vector<SymbolTable*> scope_stack = vector<SymbolTable*>();
public:
SymbolStack();
ErrorType is_func_valid(const string& func_name, const string& retype, vector<string>* params_types, bool is_override);
void push(bool is_while, Types retType = T_NONE);
void pop();
SymbolTable* get_curr_scope();
void symbol_document(const string& symbol_name,const string& symbol_type, bool is_func = false,
bool is_over = false, vector<string>* func_params_types = nullptr); // add new symbol to the stack
void func_param_document(const string& symbol_name, const string& symbol_type, int pos); // add new function to the stack
bool symbol_exists(const string& symbol_name); // does a symbol exists?
SymbolEntry* get_symbol(const string& symbol_name);
SymbolEntry* get_func_symbol(const string& func_name, const string& retype, vector<string>* params_types, int* count); // if retype == "" error if count >= 2
// bool function_exists(const string& name, vector<string>* params_types = nullptr);
bool check_program();
~SymbolStack();
};
...
#endif //HW3_SYMBOLS_H
Types是在shared_def. h中定义的枚举。Symbolics.cpp中的方法:
SymbolStack::SymbolStack(){
pos_stack.push_back(0); // init to offset = zero
this->push(false, T_VOID);
vector<string> print_param = vector<string>();
vector<string> printi_param = vector<string>();
print_param.push_back("string");
printi_param.push_back("int");
this->symbol_document("print", "void", FUNC, &print_param);
this->symbol_document("printi", "void", FUNC, &printi_param);
}
void SymbolStack::push(bool is_while, Types retType){
retType = retType == T_NONE? scope_stack.back()->ret_type : retType;
SymbolTable* first_scope = new SymbolTable(pos_stack.back(), is_while, retType);
pos_stack.push_back(pos_stack.back());
scope_stack.push_back(first_scope);
}
SymbolStack的构造函数在parser.ypp中被调用:
%{
#include <stdio.h>
#include <iostream>
#include "types.h"
#include "hw3_output.hpp"
extern int yylineno;
extern int yylex();
int yyerror(const char* message);
extern SymbolStack tables;
%}
definitions...
%%
Rule...
%%
tables = SymbolStack();
int main(){
int res = yyparse();
bool is_valid_program = tables.check_program();
if(!is_valid_program){
output::errorMainMissing();
exit(0);
}
tables.pop();
return res;
}
int yyerror(const char * message){
output::errorSyn(yylineno);
exit(0);
}
我没有设法使用gdb调试它,因为它甚至在调用main之前就发生了。如果我删除这行“this->push(false,T_VOID);”的构造。
任何帮助将不胜感激。
编辑:在我使用的任何源文件中没有任何定义为静态的。
1条答案
按热度按时间62lalag41#
我没有设法使用gdb调试它,因为它甚至在调用main之前就发生了。
main
之前发生的崩溃。1.您 * 显示 * GDB输出(但您的代码是在没有调试的情况下构建的(
-g
))。在我使用的任何源文件中没有任何东西被定义为静态的。
你有一个 global
tables
变量。崩溃很可能发生在该变量的初始化期间。如果没有http://stackoverflow.com/help/mcve,我们就无法提供太多帮助。
但是您应该能够通过使用
-g
重新构建并在SymbolStack::SymbolStack
上设置断点来调试它。我唯一能想到的是,如果
T_VOID == T_NONE
,那么这行:将使用不存在的
scope_stack.back()
(scope_stack
仍然为空),这应该会崩溃。P.S.要理解崩溃,检查崩溃指令(
(gdb) x/i $pc
)和寄存器值((gdb) info regs
)通常很有帮助。