Update[but this file cannot be compiled]
This commit is contained in:
parent
0384e19323
commit
305de47723
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue