Update[but this file cannot be compiled]

This commit is contained in:
Valk Richard Li 2019-10-11 00:10:58 -05:00 committed by GitHub
parent 0384e19323
commit 305de47723
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 53 deletions

View File

@ -13,7 +13,7 @@ class abstract_syntax_tree
public: public:
abstract_syntax_tree() abstract_syntax_tree()
{ {
ast_node_type=__root; ast_node_type=0;
statement_list.clear(); statement_list.clear();
children.clear(); children.clear();
var_number=0; var_number=0;
@ -34,6 +34,12 @@ class abstract_syntax_tree
var_number=temp.var_number; var_number=temp.var_number;
var_string=temp.var_string; var_string=temp.var_string;
} }
void tree_set_clear()
{
statement_list.clear();
children.clear();
return;
}
void print_ast_node(int tab_num) void print_ast_node(int tab_num)
{ {
for(int i=0;i<tab_num;++i) for(int i=0;i<tab_num;++i)
@ -60,6 +66,12 @@ class abstract_syntax_tree
std::cout<<"}"<<std::endl; std::cout<<"}"<<std::endl;
return; return;
} }
// for root node
void set_root()
{
ast_node_type=__root;
return;
}
// for if // for if
void set_if_expr(abstract_syntax_tree condition,abstract_syntax_tree statements) void set_if_expr(abstract_syntax_tree condition,abstract_syntax_tree statements)
{ {

View File

@ -6,12 +6,12 @@ class generator
private: private:
abstract_syntax_tree root; abstract_syntax_tree root;
std::stack<token> parse; std::stack<token> parse;
std::stack<abstract_syntax_tree> node_cache;
token this_token; token this_token;
public: public:
generator() generator()
{ {
this_token.type=0; this_token.type=0;
root.set_root();
} }
void get_token() void get_token()
{ {
@ -59,36 +59,36 @@ class generator
return; return;
} }
void gen_main_work(); void gen_main_work();
void in_curve_calc_expr(); abstract_syntax_tree in_curve_calc_expr();
void number_begin_expr(); abstract_syntax_tree number_begin_expr();
void string_begin_expr(); abstract_syntax_tree string_begin_expr();
void identifier_begin_expr(); abstract_syntax_tree identifier_begin_expr();
void call_list_expr(); abstract_syntax_tree call_list_expr();
void call_function_expr(); abstract_syntax_tree call_function_expr();
void call_hash_expr(); abstract_syntax_tree call_hash_expr();
void list_generate_expr(); abstract_syntax_tree list_generate_expr();
void hash_generate_expr(); abstract_syntax_tree hash_generate_expr();
void definition_expr(); abstract_syntax_tree definition_expr();
void assignment_expr(); abstract_syntax_tree assignment_expr();
void loop_expr(); abstract_syntax_tree loop_expr();
bool else_if_check(); bool else_if_check();
void if_else_expr(); abstract_syntax_tree if_else_expr();
void add_sub_operator_expr(); abstract_syntax_tree add_sub_operator_expr();
void mul_div_operator_expr(); abstract_syntax_tree mul_div_operator_expr();
void link_operator_expr(); abstract_syntax_tree link_operator_expr();
void compare_operator_expr(); abstract_syntax_tree compare_operator_expr();
void one_operator_expr(); abstract_syntax_tree one_operator_expr();
void check_semi_at_end(); void check_semi_at_end();
void statements_block(); abstract_syntax_tree statements_block();
void function_generate_expr(); abstract_syntax_tree function_generate_expr();
void return_expr(); abstract_syntax_tree return_expr();
}; };
void generator::check_semi_at_end() void generator::check_semi_at_end()
{ {
get_token(); get_token();
return; return;
} }
void generator::return_expr() abstract_syntax_tree generator::return_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -104,7 +104,7 @@ void generator::return_expr()
} }
return; return;
} }
void generator::statements_block() abstract_syntax_tree generator::statements_block()
{ {
get_token(); get_token();
get_token(); get_token();
@ -149,7 +149,7 @@ void generator::statements_block()
} }
return; return;
} }
void generator::function_generate_expr() abstract_syntax_tree generator::function_generate_expr()
{ {
get_token(); get_token();
if(this_token.type==__left_brace) if(this_token.type==__left_brace)
@ -176,7 +176,7 @@ void generator::function_generate_expr()
statements_block(); statements_block();
return; return;
} }
void generator::list_generate_expr() abstract_syntax_tree generator::list_generate_expr()
{ {
get_token(); get_token();
while(this_token.type!=__right_bracket) while(this_token.type!=__right_bracket)
@ -197,7 +197,7 @@ void generator::list_generate_expr()
} }
return; return;
} }
void generator::hash_generate_expr() abstract_syntax_tree generator::hash_generate_expr()
{ {
get_token(); get_token();
while(this_token.type!=__right_brace) while(this_token.type!=__right_brace)
@ -228,7 +228,7 @@ void generator::hash_generate_expr()
} }
return; return;
} }
void generator::definition_expr() abstract_syntax_tree generator::definition_expr()
{ {
get_token(); get_token();
if(this_token.type==__left_curve) if(this_token.type==__left_curve)
@ -267,7 +267,7 @@ void generator::definition_expr()
} }
return; return;
} }
void generator::assignment_expr() abstract_syntax_tree generator::assignment_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -304,7 +304,7 @@ bool generator::else_if_check()
} }
return true; return true;
} }
void generator::if_else_expr() abstract_syntax_tree generator::if_else_expr()
{ {
get_token(); get_token();
get_token(); get_token();
@ -485,7 +485,7 @@ void generator::if_else_expr()
parse.push(this_token); parse.push(this_token);
return; return;
} }
void generator::loop_expr() abstract_syntax_tree generator::loop_expr()
{ {
get_token(); get_token();
if(this_token.type==__while) if(this_token.type==__while)
@ -705,7 +705,7 @@ void generator::loop_expr()
} }
return; return;
} }
void generator::add_sub_operator_expr() abstract_syntax_tree generator::add_sub_operator_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -718,7 +718,7 @@ void generator::add_sub_operator_expr()
} }
return; return;
} }
void generator::mul_div_operator_expr() abstract_syntax_tree generator::mul_div_operator_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -731,7 +731,7 @@ void generator::mul_div_operator_expr()
} }
return; return;
} }
void generator::link_operator_expr() abstract_syntax_tree generator::link_operator_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -744,7 +744,7 @@ void generator::link_operator_expr()
} }
return; return;
} }
void generator::compare_operator_expr() abstract_syntax_tree generator::compare_operator_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -760,7 +760,7 @@ void generator::compare_operator_expr()
} }
return; return;
} }
void generator::one_operator_expr() abstract_syntax_tree generator::one_operator_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -773,7 +773,7 @@ void generator::one_operator_expr()
} }
return; return;
} }
void generator::in_curve_calc_expr() abstract_syntax_tree generator::in_curve_calc_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -808,7 +808,7 @@ void generator::in_curve_calc_expr()
} }
return; return;
} }
void generator::number_begin_expr() abstract_syntax_tree generator::number_begin_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -830,7 +830,7 @@ void generator::number_begin_expr()
} }
return; return;
} }
void generator::string_begin_expr() abstract_syntax_tree generator::string_begin_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -852,7 +852,7 @@ void generator::string_begin_expr()
} }
return; return;
} }
void generator::call_list_expr() abstract_syntax_tree generator::call_list_expr()
{ {
get_token(); get_token();
switch(this_token.type) switch(this_token.type)
@ -898,7 +898,7 @@ void generator::call_list_expr()
} }
return; return;
} }
void generator::call_function_expr() abstract_syntax_tree generator::call_function_expr()
{ {
get_token(); get_token();
while(this_token.type!=__right_curve) while(this_token.type!=__right_curve)
@ -928,13 +928,13 @@ void generator::call_function_expr()
} }
return; return;
} }
void generator::call_hash_expr() abstract_syntax_tree generator::call_hash_expr()
{ {
get_token(); get_token();
identifier_begin_expr(); identifier_begin_expr();
return; return;
} }
void generator::identifier_begin_expr() abstract_syntax_tree generator::identifier_begin_expr()
{ {
// __id has been checked // __id has been checked
get_token(); get_token();
@ -986,38 +986,40 @@ void generator::identifier_begin_expr()
} }
void generator::gen_main_work() void generator::gen_main_work()
{ {
root.tree_set_clear();
while(!parse.empty()) while(!parse.empty())
{ {
get_token(); get_token();
token t; token t;
switch(this_token.type) switch(this_token.type)
{ {
case __var:definition_expr();check_semi_at_end();break; case __var:root.add_statement(definition_expr());check_semi_at_end();break;
case __id:identifier_begin_expr();check_semi_at_end();break; case __id:root.add_statement(identifier_begin_expr());check_semi_at_end();break;
case __number:number_begin_expr();check_semi_at_end();break; case __number:root.add_statement(number_begin_expr());check_semi_at_end();break;
case __string:string_begin_expr();check_semi_at_end();break; case __string:root.add_statement(string_begin_expr());check_semi_at_end();break;
case __left_curve: case __left_curve:
t=this_token; t=this_token;
get_token(); get_token();
if(this_token.type==__var) if(this_token.type==__var)
{ {
parse.push(t); parse.push(t);
definition_expr(); root.add_statement(definition_expr());
} }
else else
{ {
in_curve_calc_expr(); root.add_statement(in_curve_calc_expr());
} }
check_semi_at_end(); check_semi_at_end();
break; break;
case __if:parse.push(this_token);if_else_expr();break; case __if:parse.push(this_token);root.add_statement(if_else_expr());break;
case __add_operator: case __add_operator:
case __sub_operator: case __sub_operator:
case __nor_operator:one_operator_expr();break; case __nor_operator:root.add_statement(one_operator_expr());break;
case __while: case __while:
case __for: case __for:
case __foreach: case __foreach:
case __forindex:parse.push(this_token);loop_expr();break; case __forindex:parse.push(this_token);root.add_statement(loop_expr());break;
case __semi:break; case __semi:break;
default:break; default:break;
} }