From 3732fa7a6831c86c835b0678f7ffc48858b8016b Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sat, 12 Oct 2019 20:48:52 +0800 Subject: [PATCH] Finished part of AST --- version1.0/ast.h | 62 ++++++++++--- version1.0/ast_generator.h | 164 +++++++++++++++++++++------------- version1.0/nasal_parser.h | 6 +- version1.0/nasal_token_type.h | 2 + 4 files changed, 159 insertions(+), 75 deletions(-) diff --git a/version1.0/ast.h b/version1.0/ast.h index d7f696d..df3bb9e 100644 --- a/version1.0/ast.h +++ b/version1.0/ast.h @@ -74,8 +74,24 @@ class abstract_syntax_tree 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(!children.empty()) + { + for(int i=0;i::iterator i=children.begin();i!=children.end();++i) + i->print_ast_node(tab_num+1); + std::cout<::iterator i=statement_list.begin();i!=statement_list.end();++i) + i->print_ast_node(tab_num+1); + std::cout< parameters,abstract_syntax_tree block) + { + ast_node_type=__func; + children=parameters; + statement_list=block.statement_list; + return; + } // for sub-tree node operator void set_two_operator(const int operator_type,abstract_syntax_tree f_child,abstract_syntax_tree s_child) { @@ -153,13 +185,6 @@ class abstract_syntax_tree children.push_back(f_child); return; } - // for leaf node identifier - void set_node_to_identifier(std::string& str) - { - ast_node_type=__id; - id_name=str; - return; - } // for leaf node call void set_node_to_call_function() { @@ -177,9 +202,26 @@ class abstract_syntax_tree return; } // for leaf node list - void set_node_to_list() + void set_node_to_list(std::list list_members) { ast_node_type=__list; + children=list_members; + return; + } + // for leaf node hash + void set_node_to_hash(std::list hash_members) + { + ast_node_type=__hash; + children=hash_members; + return; + } + // for hash member + void set_node_to_hashmember(std::string& name,abstract_syntax_tree mem_var) + { + ast_node_type=__hash_member; + id_name=name; + children.clear(); + children.push_back(mem_var); return; } // for leaf node hash diff --git a/version1.0/ast_generator.h b/version1.0/ast_generator.h index 15428c9..eae83c2 100644 --- a/version1.0/ast_generator.h +++ b/version1.0/ast_generator.h @@ -161,6 +161,8 @@ abstract_syntax_tree generator::statements_block() } abstract_syntax_tree generator::function_generate_expr() { + abstract_syntax_tree node; + std::list parameters; get_token(); if(this_token.type==__left_brace) parse.push(this_token); @@ -171,75 +173,92 @@ abstract_syntax_tree generator::function_generate_expr() { if(this_token.type==__id) { + abstract_syntax_tree param; + param.set_node_to_id(this_token.content); + parameters.push_back(param); get_token(); if(this_token.type==__right_curve) parse.push(this_token); } else if(this_token.type==__dynamic_id) { + abstract_syntax_tree param; + param.set_node_to_dynid(this_token.content); + parameters.push_back(param); get_token(); parse.push(this_token); } get_token(); } } - statements_block(); - return; + node.set_node_to_function(parameters,statements_block()); + return node; } abstract_syntax_tree generator::list_generate_expr() { + abstract_syntax_tree node; + std::list list_members; get_token(); while(this_token.type!=__right_bracket) { switch(this_token.type) { - case __number:number_begin_expr();break; - case __string:string_begin_expr();break; - case __id:identifier_begin_expr();break; - case __left_bracket:list_generate_expr();break; - case __left_brace:hash_generate_expr();break; - case __left_curve:in_curve_calc_expr();break; + case __number:list_members.push_back(number_begin_expr());break; + case __string:list_members.push_back(string_begin_expr());break; + case __id:list_members.push_back(identifier_begin_expr());break; + case __left_bracket:list_members.push_back(list_generate_expr());break; + case __left_brace:list_members.push_back(hash_generate_expr());break; + case __left_curve:list_members.push_back(in_curve_calc_expr());break; default:break; } get_token(); if(this_token.type==__comma) get_token(); } - return; + node.set_node_to_list(list_members); + return node; } abstract_syntax_tree generator::hash_generate_expr() { + abstract_syntax_tree node; + std::list hashmember; + abstract_syntax_tree elem; + std::string id_name; get_token(); while(this_token.type!=__right_brace) { switch(this_token.type) { - case __number:number_begin_expr();break; - case __string:string_begin_expr();break; - case __id:identifier_begin_expr();break; + // case __number:number_begin_expr();break; + // case __string:string_begin_expr();break; + case __id:id_name=this_token.content;break; default:break; } get_token(); 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 __func:function_generate_expr();break; - case __left_bracket:list_generate_expr();break; - case __left_brace:hash_generate_expr();break; - case __left_curve:in_curve_calc_expr();break; + case __number:elem.set_node_to_hashmember(id_name,number_begin_expr());break; + case __string:elem.set_node_to_hashmember(id_name,string_begin_expr());break; + case __id:elem.set_node_to_hashmember(id_name,identifier_begin_expr());break; + case __func:elem.set_node_to_hashmember(id_name,function_generate_expr());break; + case __left_bracket:elem.set_node_to_hashmember(id_name,list_generate_expr());break; + case __left_brace:elem.set_node_to_hashmember(id_name,hash_generate_expr());break; + case __left_curve:elem.set_node_to_hashmember(id_name,in_curve_calc_expr());break; default:break; } + hashmember.push_back(elem); get_token(); if(this_token.type==__comma) get_token(); } - return; + node.set_node_to_hash(hashmember); + return node; } abstract_syntax_tree generator::definition_expr() { + abstract_syntax_tree node; + std::string id_name; get_token(); if(this_token.type==__left_curve) { @@ -251,11 +270,15 @@ abstract_syntax_tree generator::definition_expr() break; } } + else if(this_token.type==__id) + { + ; + } get_token(); if(this_token.type==__semi) { parse.push(this_token); - return; + return node; } get_token(); token t; @@ -275,10 +298,11 @@ abstract_syntax_tree generator::definition_expr() case __left_curve:in_curve_calc_expr();break; default:break; } - return; + return node; } abstract_syntax_tree generator::assignment_expr() { + abstract_syntax_tree node; get_token(); switch(this_token.type) { @@ -294,7 +318,7 @@ abstract_syntax_tree generator::assignment_expr() case __left_curve:in_curve_calc_expr();break; default:break; } - return; + return node; } bool generator::else_if_check() { @@ -316,6 +340,7 @@ bool generator::else_if_check() } abstract_syntax_tree generator::if_else_expr() { + abstract_syntax_tree node; get_token(); get_token(); get_token(); @@ -377,7 +402,7 @@ abstract_syntax_tree generator::if_else_expr() } } if(parse.empty()) - return; + return node; get_token(); while(this_token.type==__elsif || else_if_check()) { @@ -440,7 +465,7 @@ abstract_syntax_tree generator::if_else_expr() } } if(parse.empty()) - return; + return node; get_token(); } if(this_token.type==__else) @@ -493,10 +518,11 @@ abstract_syntax_tree generator::if_else_expr() } else parse.push(this_token); - return; + return node; } abstract_syntax_tree generator::loop_expr() { + abstract_syntax_tree node; get_token(); if(this_token.type==__while) { @@ -713,7 +739,7 @@ abstract_syntax_tree generator::loop_expr() } } } - return; + return node; } abstract_syntax_tree generator::continue_break_expr() { @@ -723,88 +749,100 @@ abstract_syntax_tree generator::continue_break_expr() } abstract_syntax_tree generator::add_sub_operator_expr() { + abstract_syntax_tree node; 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; + case __number:node=number_begin_expr();break; + case __string:node=string_begin_expr();break; + case __id:node=identifier_begin_expr();break; + case __left_curve:node=in_curve_calc_expr();break; default:break; } - return; + return node; } abstract_syntax_tree generator::mul_div_operator_expr() { + abstract_syntax_tree node; 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; + case __number:node=number_begin_expr();break; + case __string:node=string_begin_expr();break; + case __id:node=identifier_begin_expr();break; + case __left_curve:node=in_curve_calc_expr();break; default:break; } - return; + return node; } abstract_syntax_tree generator::link_operator_expr() { + abstract_syntax_tree node; 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; + case __number:node=number_begin_expr();break; + case __string:node=string_begin_expr();break; + case __id:node=identifier_begin_expr();break; + case __left_curve:node=in_curve_calc_expr();break; default:break; } - return; + return node; } abstract_syntax_tree generator::compare_operator_expr() { + abstract_syntax_tree node; 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; + case __number:node=number_begin_expr();break; + case __string:node=string_begin_expr();break; + case __id:node=identifier_begin_expr();break; + case __left_curve:node=in_curve_calc_expr();break; case __add_operator: case __sub_operator: - case __nor_operator:one_operator_expr();break; + case __nor_operator:node=one_operator_expr();break; default:break; } - return; + return node; } abstract_syntax_tree generator::one_operator_expr() { + abstract_syntax_tree node; + int type=this_token.type; 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; + case __number:node.set_one_operator(type,number_begin_expr());;break; + case __string:node.set_one_operator(type,string_begin_expr());break; + case __id:node.set_one_operator(type,identifier_begin_expr());break; + case __left_curve:node.set_one_operator(type,in_curve_calc_expr());break; default:break; } - return; + return node; } abstract_syntax_tree generator::in_curve_calc_expr() { + abstract_syntax_tree node; 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; - case __left_curve:in_curve_calc_expr();break; + case __nor_operator:node=one_operator_expr();break; + case __number:node=number_begin_expr();break; + case __string:node=string_begin_expr();break; + case __id:node=identifier_begin_expr();break; + case __left_curve:node=in_curve_calc_expr();break; default:parse.push(this_token);break; } get_token(); get_token(); + // unfinished + + + + switch(this_token.type) { case __add_operator: @@ -822,7 +860,7 @@ abstract_syntax_tree generator::in_curve_calc_expr() case __cmp_more_or_equal:compare_operator_expr();break; default:parse.push(this_token);break; } - return; + return node; } abstract_syntax_tree generator::number_begin_expr() { @@ -874,6 +912,7 @@ abstract_syntax_tree generator::string_begin_expr() } abstract_syntax_tree generator::call_list_expr() { + abstract_syntax_tree node; get_token(); switch(this_token.type) { @@ -893,7 +932,7 @@ abstract_syntax_tree generator::call_list_expr() case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; case __left_curve:in_curve_calc_expr();break; - case __right_bracket:return;break;// this is [number:] + case __right_bracket:break;// this is [number:] } get_token(); get_token(); @@ -916,10 +955,11 @@ abstract_syntax_tree generator::call_list_expr() default:parse.push(this_token);break; } } - return; + return node; } abstract_syntax_tree generator::call_function_expr() { + abstract_syntax_tree node; get_token(); while(this_token.type!=__right_curve) { @@ -946,7 +986,7 @@ abstract_syntax_tree generator::call_function_expr() case __dot:call_hash_expr();break; default:parse.push(this_token);break; } - return; + return node; } abstract_syntax_tree generator::call_hash_expr() { diff --git a/version1.0/nasal_parser.h b/version1.0/nasal_parser.h index 91158ed..7b143c7 100644 --- a/version1.0/nasal_parser.h +++ b/version1.0/nasal_parser.h @@ -298,8 +298,8 @@ void nasal_parser::hash_generate_expr() { switch(this_token.type) { - case __number:number_begin_expr();break; - case __string:string_begin_expr();break; + //case __number:number_begin_expr();break; + //case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; default: ++error; @@ -1195,7 +1195,7 @@ void nasal_parser::call_list_expr() case __string:string_begin_expr();break; case __id:identifier_begin_expr();break; case __left_curve:in_curve_calc_expr();break; - case __right_bracket:return;break;// this is [number:] + case __right_bracket:parse.push(this_token);break;// this is [number:] } get_token(); if(this_token.type!=__right_bracket) diff --git a/version1.0/nasal_token_type.h b/version1.0/nasal_token_type.h index 89ee3c2..8841993 100644 --- a/version1.0/nasal_token_type.h +++ b/version1.0/nasal_token_type.h @@ -31,6 +31,7 @@ enum token_type __root, __list,__hash, + __hash_member, __call_function,__list_search,__hash_search, __block, __definition,__assignment, @@ -95,6 +96,7 @@ void print_token(int type) case __root: context="root";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 __list_search: context="call_list";break; case __hash_search: context="call_hash";break;