diff --git a/version1.0/abstract_syntax_tree.h b/version1.0/abstract_syntax_tree.h index bd1cd34..da9c66d 100644 --- a/version1.0/abstract_syntax_tree.h +++ b/version1.0/abstract_syntax_tree.h @@ -137,7 +137,7 @@ class operator_expr:public ast_tree_node public: operator_expr():ast_tree_node() { - type=__operator; + type=__add_operator; } void set_operator_type(int oprt_type) { diff --git a/version1.0/ast.h b/version1.0/ast.h index 36b51c8..53adf86 100644 --- a/version1.0/ast.h +++ b/version1.0/ast.h @@ -6,6 +6,7 @@ class abstract_syntax_tree protected: int ast_node_type; std::list statement_list; + std::list children; double var_number; std::string var_string; public: @@ -13,25 +14,65 @@ class abstract_syntax_tree { ast_node_type=__root; statement_list.clear(); + children.clear(); var_number=0; var_string=""; } abstract_syntax_tree(const abstract_syntax_tree& temp) { ast_node_type=temp.ast_node_type; - statement_list=temp.statement_list; + if(temp.statement_list.empty()) + statement_list.clear(); + else + statement_list=temp.statement_list; + if(temp.children.empty()) + children.clear(); + else + children=temp.children; var_number=temp.var_number; var_string=temp.var_string; } + // for statement block + void set_block() + { + ast_node_type=__block; + return; + } + void add_statement(abstract_syntax_tree statement_head) + { + statement_list.push_back(statement_head); + return; + } + // for sub-tree node operator + void set_two_operator(const int operator_type,abstract_syntax_tree f_child,abstract_syntax_tree s_child) + { + ast_node_type=operator_type; + children.push_back(f_child); + children.push_back(s_child); + return; + } + void set_one_operator(const int operator_type,abstract_syntax_tree f_child) + { + ast_node_type=operator_type; + children.push_back(f_child); + return; + } + // for leaf node string void set_node_to_string(std::string& str) { ast_node_type=__string; var_string=str; return; } + // for leaf node number void set_node_to_number(std::string& str) { ast_node_type=__number; + if(str=="nil") + { + var_number=0; + return; + } if((int)str.length()>2 && (str[1]=='x' || str[1]=='o')) { if(str[1]=='x') diff --git a/version1.0/nasal_parser.h b/version1.0/nasal_parser.h index 32378ca..84496a5 100644 --- a/version1.0/nasal_parser.h +++ b/version1.0/nasal_parser.h @@ -127,6 +127,7 @@ class nasal_parser void mul_div_operator_expr(); void link_operator_expr(); void compare_operator_expr(); + void one_operator_expr(); void check_semi_at_end(); void statements_block(); void function_generate_expr(); @@ -181,6 +182,9 @@ void nasal_parser::statements_block() case __number:number_begin_expr();check_semi_at_end();break; case __string:string_begin_expr();check_semi_at_end();break; case __if:parse.push(this_token);if_else_expr();break; + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __while: case __for: case __foreach: @@ -371,6 +375,9 @@ void nasal_parser::definition_expr() case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; case __func:function_generate_expr();break; + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __left_bracket:list_generate_expr();break; case __left_brace:hash_generate_expr();break; case __left_curve:in_curve_calc_expr();break; @@ -391,6 +398,9 @@ void nasal_parser::assignment_expr() case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; case __func:function_generate_expr();break; + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __left_bracket:list_generate_expr();break; case __left_brace:hash_generate_expr();break; case __left_curve:in_curve_calc_expr();break; @@ -439,6 +449,9 @@ void nasal_parser::if_else_expr() get_token(); switch(this_token.type) { + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __number:number_begin_expr();break; case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; @@ -457,6 +470,8 @@ void nasal_parser::if_else_expr() return; } statements_block(); + if(parse.empty()) + return; get_token(); while(this_token.type==__elsif || else_if_check()) { @@ -470,6 +485,9 @@ void nasal_parser::if_else_expr() get_token(); switch(this_token.type) { + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __number:number_begin_expr();break; case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; @@ -487,6 +505,8 @@ void nasal_parser::if_else_expr() return; } statements_block(); + if(parse.empty()) + return; get_token(); } if(this_token.type==__else) @@ -510,6 +530,9 @@ void nasal_parser::loop_expr() get_token(); switch(this_token.type) { + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __number:number_begin_expr();break; case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; @@ -555,6 +578,9 @@ void nasal_parser::loop_expr() get_token(); switch(this_token.type) { + case __add_operator: + case __sub_operator: + case __nor_operator:one_operator_expr();break; case __id:identifier_begin_expr();break; case __number:number_begin_expr();break; case __string:string_begin_expr();break; @@ -718,11 +744,31 @@ void nasal_parser::compare_operator_expr() } return; } +void nasal_parser::one_operator_expr() +{ + get_token(); + switch(this_token.type) + { + case __number:number_begin_expr();break; + case __string:string_begin_expr();break; + case __id:identifier_begin_expr();break; + case __left_curve:in_curve_calc_expr();break; + default: + ++error; + std::cout<<">>[Error] line "<