#ifndef __ABSTRACT_SYNTAX_TREE_H__ #define __ABSTRACT_SYNTAX_TREE_H__ class abstract_syntax_tree { private: // basic elements int line; int symbol_number; bool symbol_is_global; int node_type; std::list children; // is this node is a number|string|identifier node // then the three elements below is of great use double var_number; std::string var_string; std::string var_name; // var_name is set for __id public: // basic abstract_syntax_tree(); abstract_syntax_tree(const abstract_syntax_tree&); ~abstract_syntax_tree(); abstract_syntax_tree& operator=(const abstract_syntax_tree&); // main functions // print void print_tree(); void print_tree_block(const int); // set void set_clear(); void set_node_type(const int); void set_node_line(const int); void set_symbol_number(const int); void set_var_string(std::string); void set_var_number(std::string); void set_var_name(std::string); void set_var_scope(bool);// true means it exists in global scope void add_children(abstract_syntax_tree); // get int get_node_type(); int get_node_line(); int get_symbol_number(); double get_var_number(); std::string get_var_string(); std::string get_var_name(); bool get_var_scope(); std::list& get_children(); }; abstract_syntax_tree::abstract_syntax_tree() { node_type=__null_type; line=0; symbol_number=-1; symbol_is_global=false; var_number=0; var_string=""; var_name=""; children.clear(); return; } abstract_syntax_tree::abstract_syntax_tree(const abstract_syntax_tree& tmp) { node_type=tmp.node_type; line=tmp.line; symbol_number=tmp.symbol_number; symbol_is_global=tmp.symbol_is_global; var_number=tmp.var_number; var_string=tmp.var_string; var_name=tmp.var_name; children=tmp.children; return; } abstract_syntax_tree::~abstract_syntax_tree() { node_type=__null_type; line=0; symbol_number=-1; symbol_is_global=false; var_number=0; var_string.clear(); var_name.clear(); children.clear(); return; } abstract_syntax_tree& abstract_syntax_tree::operator=(const abstract_syntax_tree& tmp) { node_type=tmp.node_type; line=tmp.line; symbol_number=tmp.symbol_number; symbol_is_global=tmp.symbol_is_global; var_number=tmp.var_number; var_string=tmp.var_string; var_name=tmp.var_name; children.clear(); children=tmp.children; return *this; } void abstract_syntax_tree::print_tree() { std::cout<<">> [Abstract-syntax-tree] get tree root: "<<(this)<<""<::iterator i=children.begin();i!=children.end();++i) i->print_tree_block(n+1); } return; } void abstract_syntax_tree::set_clear() { node_type=__null_type; line=0; symbol_number=-1; var_number=0; var_string=""; var_name=""; children.clear(); return; } void abstract_syntax_tree::set_node_type(const int __node_type) { node_type=__node_type; return; } void abstract_syntax_tree::set_node_line(const int __line) { if(__line>=0) line=__line; else { std::cout<<">> [Abstract-syntax-tree-warning] incorrect line under 0: "<<__line<<"."<& abstract_syntax_tree::get_children() { return children; } #endif