Это обратная трассировка:

Определение SymbolStack (в Symbols.h):
#ifndef HW3_SYMBOLS_H #define HW3_SYMBOLS_H #include #include #include #include "shared_def.h" используя станд::вектор; используя std::string; внешний int yylineno; ... класс СимволСтек { публика: вектор pos_stack = вектор(); векторscope_stack = вектор(); публика: СимволСтек(); ErrorType is_func_valid(const string& func_name, const string& retype, вектор* params_types, bool is_override); void push(bool is_ while, Types retType = T_NONE); недействительный поп (); Таблица символов* get_curr_scope(); void символ_документ (константная строка& имя_символа, константная строка& тип_символа, bool is_func = false, bool is_over = false, вектор* func_params_types = nullptr); // добавляем новый символ в стек void func_param_document (const string& имя_символа, const string& тип_символа, int pos); // добавляем новую функцию в стек boolsymbol_exists(const string&symbol_name); // существует ли символ? SymbolEntry* get_symbol(const string& имя_символа); SymbolEntry* get_func_symbol(const string& func_name, const string& retype, вектор* params_types, int* count); // if retype == "" ошибка, если count >= 2 // bool function_exists(const string& name, вектор* params_types = nullptr); bool check_program(); ~Стек символов(); }; ... #endif //HW3_SYMBOLS_H Типы — это перечисление, определенное в файлеshared_def.h. Методы в Symbols.cpp:
SymbolStack::SymbolStack(){ pos_stack.push_back(0); // инициализация до смещения = ноль это->push(false, T_VOID); вектор print_param = вектор(); вектор printi_param = вектор(); print_param.push_back("строка"); 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 = новый SymbolTable(pos_stack.back(), is_ while, retType); pos_stack.push_back(pos_stack.back()); scope_stack.push_back(first_scope); } Конструктор SymbolStack вызывается в parser.ypp:
%{ #include #include #include "types.h" #include "hw3_output.hpp" внешний int yylineno; внешний int yylex(); int yyerror(const char* message); внешние таблицы SymbolStack; %} определения... %% Правило... %% таблицы = СимволСтек(); интервал основной(){ int res = yyparse(); bool is_valid_program = table.check_program(); если(!is_valid_program){ вывод::errorMainMissing(); выход (0); } таблицы.поп(); вернуть разрешение; } int yyerror(const char * message){ вывод::errorSyn(yylineno); выход (0); } Мне не удалось отладить это с помощью gdb, потому что это происходит еще до вызова main. Это также произойдет, если я удалю эту строку «this->push(false, T_VOID);» из конструктора.
РЕДАКТИРОВАТЬ: Ни в одном исходном файле, который я использую, нет ничего, что было бы определено как статическое.
Мобильная версия