diff --git a/version1.0/ast.h b/version1.0/ast.h index a515048..d2f862b 100644 --- a/version1.0/ast.h +++ b/version1.0/ast.h @@ -7,6 +7,13 @@ class abstract_syntax_tree int ast_node_type; std::list statement_list; std::list children; + + // for definition and assignment + std::list var_list; + std::list var_changed_list; + std::list var_content_list; + + // for number and string leaf double var_number; std::string var_string; std::string id_name; @@ -16,6 +23,11 @@ class abstract_syntax_tree ast_node_type=0; statement_list.clear(); children.clear(); + + var_list.clear(); + var_changed_list.clear(); + var_content_list.clear(); + var_number=0; var_string=""; id_name="ukn"; @@ -31,8 +43,22 @@ class abstract_syntax_tree children.clear(); else children=temp.children; + if(temp.var_list.empty()) + var_list.clear(); + else + var_list=temp.var_list; + + if(temp.var_changed_list.empty()) + var_changed_list.clear(); + else + var_changed_list=temp.var_changed_list; + if(temp.var_content_list.empty()) + var_content_list.clear(); + else + var_content_list=temp.var_content_list; var_number=temp.var_number; var_string=temp.var_string; + id_name=temp.id_name; } abstract_syntax_tree& operator=(const abstract_syntax_tree temp) { @@ -53,17 +79,20 @@ class abstract_syntax_tree { statement_list.clear(); children.clear(); + var_list.clear(); + var_changed_list.clear(); + var_content_list.clear(); return; } void print_ast_node(int tab_num) { + std::string indent=""; for(int i=0;i::iterator i=var_list.begin();i!=var_list.end();++i) + i->print_ast_node(tab_num+1); + std::cout<::iterator i=var_content_list.begin();i!=var_content_list.end();++i) + i->print_ast_node(tab_num+1); + return; + } + std::cout<<"{ Type:"; print_token(ast_node_type); - std::cout<<"]"<::iterator i=children.begin();i!=children.end();++i) i->print_ast_node(tab_num+1); } if(!statement_list.empty()) { - for(int i=0;i::iterator i=statement_list.begin();i!=statement_list.end();++i) i->print_ast_node(tab_num+1); } - for(int i=0;i name_list,std::list var_content) { ast_node_type=__definition; - id_name=name; - children.push_back(var_content); + var_list=name_list; + var_content_list=var_content; return; } // for assignment - void set_assignment_expr() + void set_assignment_expr(std::list to_be_changed,std::list var_content) { ast_node_type=__assignment; + var_changed_list=to_be_changed; + var_content_list=var_content; + return; + } + // for choose block + void set_choose_block(std::list if_else_statements) + { + ast_node_type=__ifelse; + statement_list=if_else_statements; return; } // for if diff --git a/version1.0/ast_generator.h b/version1.0/ast_generator.h index 6b9cc72..4bdf93f 100644 --- a/version1.0/ast_generator.h +++ b/version1.0/ast_generator.h @@ -258,13 +258,18 @@ abstract_syntax_tree generator::hash_generate_expr() abstract_syntax_tree generator::definition_expr() { abstract_syntax_tree node; - std::string id_name; + abstract_syntax_tree id; + std::list name_list; + std::list var_content; + get_token(); if(this_token.type==__left_curve) { while(this_token.type!=__right_curve) { get_token(); + id.set_node_to_id(this_token.content); + name_list.push_back(id); get_token(); if(this_token.type==__right_curve) break; @@ -272,37 +277,43 @@ abstract_syntax_tree generator::definition_expr() } else if(this_token.type==__id) { - id_name=this_token.content; + id.set_node_to_id(this_token.content); + name_list.push_back(id); } get_token(); if(this_token.type==__semi) { parse.push(this_token); + node.set_definition_expr(name_list,var_content); return node; } get_token(); token t; t.line=this_token.line; t.type=__semi; + switch(this_token.type) { - case __number:node.set_definition_expr(id_name,number_begin_expr());break; - case __string:node.set_definition_expr(id_name,string_begin_expr());break; - case __id:node.set_definition_expr(id_name,identifier_begin_expr());break; - case __func:node.set_definition_expr(id_name,function_generate_expr());parse.push(t);break; + case __number:var_content.push_back(number_begin_expr());break; + case __string:var_content.push_back(string_begin_expr());break; + case __id:var_content.push_back(identifier_begin_expr());break; + case __func:var_content.push_back(function_generate_expr());parse.push(t);break; case __add_operator: case __sub_operator: - case __nor_operator:node.set_definition_expr(id_name,one_operator_expr());break; - case __left_bracket:node.set_definition_expr(id_name,list_generate_expr());break; - case __left_brace:node.set_definition_expr(id_name,hash_generate_expr());break; - case __left_curve:node.set_definition_expr(id_name,in_curve_calc_expr());break; + case __nor_operator:var_content.push_back(one_operator_expr());break; + case __left_bracket:var_content.push_back(list_generate_expr());break; + case __left_brace:var_content.push_back(hash_generate_expr());break; + case __left_curve:var_content.push_back(in_curve_calc_expr());break; default:break; } + node.set_definition_expr(name_list,var_content); return node; } abstract_syntax_tree generator::assignment_expr() { abstract_syntax_tree node; + std::list to_be_changed; + std::list var_content; get_token(); switch(this_token.type) { @@ -318,7 +329,7 @@ abstract_syntax_tree generator::assignment_expr() case __left_curve:in_curve_calc_expr();break; default:break; } - node.set_assignment_expr(); + node.set_assignment_expr(to_be_changed,var_content); return node; } bool generator::else_if_check() @@ -842,16 +853,13 @@ abstract_syntax_tree generator::in_curve_calc_expr() get_token(); // unfinished - - - switch(this_token.type) { case __add_operator: - case __sub_operator:add_sub_operator_expr();break; + case __sub_operator:node.set_two_operator(this_token.type,node,add_sub_operator_expr());break; case __mul_operator: - case __div_operator:mul_div_operator_expr();break; - case __link_operator:link_operator_expr();break; + case __div_operator:node.set_two_operator(this_token.type,node,mul_div_operator_expr());break; + case __link_operator:node.set_two_operator(this_token.type,node,link_operator_expr());break; case __and_operator: case __or_operator: case __cmp_equal: @@ -859,7 +867,7 @@ abstract_syntax_tree generator::in_curve_calc_expr() case __cmp_less: case __cmp_more: case __cmp_less_or_equal: - case __cmp_more_or_equal:compare_operator_expr();break; + case __cmp_more_or_equal:node.set_two_operator(this_token.type,node,compare_operator_expr());break; default:parse.push(this_token);break; } return node;