From 664893aeac9b29de6c4c32e53a9580e89a856b09 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sun, 12 Jan 2020 21:41:27 +0800 Subject: [PATCH] update --- version2.0/nasal_enum.h | 48 ++++++++++++++++++---------- version2.0/nasal_parse.h | 69 ++++++++++++++++++++++++++++++++++------ 2 files changed, 91 insertions(+), 26 deletions(-) diff --git a/version2.0/nasal_enum.h b/version2.0/nasal_enum.h index 6a0077d..4aeca96 100644 --- a/version2.0/nasal_enum.h +++ b/version2.0/nasal_enum.h @@ -49,6 +49,7 @@ enum parse_token_type __root, __null_type, __multi_id, + __parameters, __list,__hash, __hash_member, __call_function,__call_array,__call_hash, @@ -121,21 +122,22 @@ void print_parse_token(int type) case __number: context="number"; break; case __string: context="string"; break; - case __root: context="root"; break; - case __null_type: context="null_type"; break; - case __multi_id: context="multi_identifiers"; break; - case __list: context="list"; break; - case __hash: context="hash"; break; - case __hash_member: context="hash_member"; break; - case __call_function: context="call_func"; break; - case __call_array: context="call_array"; break; - case __call_hash: context="call_hash"; break; - case __normal_statement_block:context="block"; break; - case __definition: context="definition"; break; - case __assignment: context="assignment"; break; - case __function: context="function"; break; - case __loop: context="loop"; break; - case __ifelse: context="if-else"; break; + case __root: context="root"; break; + case __null_type: context="null_type"; break; + case __multi_id: context="identifiers"; break; + case __parameters: context="parameters"; break; + case __list: context="list"; break; + case __hash: context="hash"; break; + case __hash_member: context="hash_member"; break; + case __call_function: context="call_func"; break; + case __call_array: context="call_array"; break; + case __call_hash: context="call_hash"; break; + case __normal_statement_block:context="block"; break; + case __definition: context="definition"; break; + case __assignment: context="assignment"; break; + case __function: context="function"; break; + case __loop: context="loop"; break; + case __ifelse: context="if-else"; break; default: context="undefined_token";break; } @@ -151,6 +153,9 @@ enum parse_error_type definition_lack_equal, // lack '=' when not getting ';' definition_wrong_type, // need identifier but get number or string multi_definition_need_curve, // lack right curve when generating 'var (id,id,id)' + error_begin_token_of_scalar, // in scalar_generate() + lack_left_curve, // lack left curve + lack_right_curve, // lack right curve }; void print_parse_error(int error_type,int line,int error_token_type=__stack_end) @@ -171,9 +176,18 @@ void print_parse_error(int error_type,int line,int error_token_type=__stack_end) case definition_lack_equal: std::cout<get_token(); abstract_syntax_tree scalar_node; + scalar_node.set_line(this_token.line); switch(this_token.type) { case __nor_operator: @@ -189,16 +192,32 @@ abstract_syntax_tree nasal_parse::scalar_generate() case __left_brace:break; case __left_bracket:break; case __func:break; + default: + ++error; + print_parse_error(error_begin_token_of_scalar,this_token.line,this_token.type); + break; } return scalar_node; } +abstract_syntax_tree nasal_parse::function_generate() +{ + abstract_syntax_tree function_node; + abstract_syntax_tree parameter_list; + this->get_token(); // get 'func' + function_node.set_type(__function); + function_node.set_line(this_token.line); + parameter_list.set_type(__parameters); + parameter_list.set_line(this_token.line); + return function_node; +} + abstract_syntax_tree nasal_parse::var_outside_definition() { - abstract_syntax_tree definition_node; - definition_node.set_type(__definition); + abstract_syntax_tree var_outsied_definition_node; + var_outsied_definition_node.set_type(__definition); this->get_token();// get 'var' - definition_node.set_line(this_token.line); + var_outsied_definition_node.set_line(this_token.line); this->get_token(); if(this_token.type==__id) { @@ -206,12 +225,12 @@ abstract_syntax_tree nasal_parse::var_outside_definition() new_var_identifier.set_type(__id); new_var_identifier.set_line(this_token.line); new_var_identifier.set_name(this_token.str); - definition_node.add_child(new_var_identifier); + var_outsied_definition_node.add_child(new_var_identifier); this->get_token(); if(this_token.type==__semi) this->push_token();// var id else if(this_token.type==__equal) - definition_node.add_child(scalar_generate());// var id = scalar + var_outsied_definition_node.add_child(scalar_generate());// var id = scalar else { this->push_token(); @@ -248,7 +267,7 @@ abstract_syntax_tree nasal_parse::var_outside_definition() break; } } - definition_node.add_child(multi_identifier); + var_outsied_definition_node.add_child(multi_identifier); this->get_token(); if(this_token.type==__semi) this->push_token();// var (id,id,id) @@ -269,14 +288,24 @@ abstract_syntax_tree nasal_parse::var_outside_definition() ++error; print_parse_error(definition_lack_id,this_token.line); } - return definition_node; + return var_outsied_definition_node; +} + +abstract_syntax_tree nasal_parse::var_inside_definition() +{ + abstract_syntax_tree var_inside_definition_node; + var_inside_definition_node.set_type(__definition); + this->get_token(); // get '(' + this->get_token(); // get 'var' + var_inside_definition_node.set_line(this_token.line); + return var_inside_definition_node; } abstract_syntax_tree nasal_parse::loop_expr() { abstract_syntax_tree loop_main_node; loop_main_node.set_type(__loop); - this->get_token(); + this->get_token(); // get the first token of loop loop_main_node.set_line(this_token.line); switch(this_token.type) { @@ -291,9 +320,31 @@ abstract_syntax_tree nasal_parse::loop_expr() abstract_syntax_tree nasal_parse::choose_expr() { abstract_syntax_tree choose_main_node; + abstract_syntax_tree if_node; + abstract_syntax_tree elsif_node; + abstract_syntax_tree else_node; choose_main_node.set_type(__ifelse); - this->get_token();// get 'if' + // get 'if' + this->get_token(); choose_main_node.set_line(this_token.line); + if_node.set_type(__if); + if_node.set_line(this_token.line); + this->get_token(); + if(this_token.type!=__left_curve) + { + ++error; + print_parse_error(lack_left_curve,this_token.line); + } + if_node.add_child(scalar_generate()); + this->get_token(); + if(this_token.type!=__right_curve) + { + ++error; + print_parse_error(lack_right_curve,this_token.line); + } + // add statements + + // get elsif or else if return choose_main_node; } #endif