Add one-operator +-! & add new element in ast_node
This commit is contained in:
parent
b1d7e4b938
commit
a9ca813b72
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -6,6 +6,7 @@ class abstract_syntax_tree
|
|||
protected:
|
||||
int ast_node_type;
|
||||
std::list<abstract_syntax_tree> statement_list;
|
||||
std::list<abstract_syntax_tree> 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')
|
||||
|
|
|
@ -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 "<<this_token.line<<": expect a data after this operator."<<std::endl;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
void nasal_parser::in_curve_calc_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;
|
||||
|
@ -980,6 +1026,9 @@ void nasal_parser::parse_main_work()
|
|||
case __string:string_begin_expr();check_semi_at_end();break;
|
||||
case __left_curve:in_curve_calc_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:
|
||||
|
|
|
@ -29,7 +29,8 @@ enum token_type
|
|||
__number,__string,__id,__dynamic_id,
|
||||
//basic elements
|
||||
|
||||
__root,__operator,
|
||||
__root,
|
||||
__block,
|
||||
__definition,__assignment,
|
||||
__function,__loop,__ifelse
|
||||
};
|
||||
|
@ -73,16 +74,16 @@ void print_token(int type)
|
|||
case __unknown_operator: context="unknown_operator";break;
|
||||
case __var: context="var"; break;
|
||||
case __func: context="func";break;
|
||||
case __continue: context="ctn"; break;
|
||||
case __break: context="brk"; break;
|
||||
case __continue: context="continye"; break;
|
||||
case __break: context="break"; break;
|
||||
case __for: context="for"; break;
|
||||
case __forindex: context="foridx";break;
|
||||
case __foreach: context="foreh";break;
|
||||
case __forindex: context="forindex";break;
|
||||
case __foreach: context="foreach";break;
|
||||
case __while: context="while";break;
|
||||
case __if: context="if";break;
|
||||
case __elsif: context="elsif";break;
|
||||
case __else: context="else";break;
|
||||
case __return: context="rtrn";break;
|
||||
case __return: context="return";break;
|
||||
|
||||
case __id: context="id";break;
|
||||
case __dynamic_id: context="id...";break;
|
||||
|
@ -90,7 +91,7 @@ void print_token(int type)
|
|||
case __string: context="str";break;
|
||||
|
||||
case __root: context="root";break;
|
||||
case __operator: context="operator";break;
|
||||
case __block: context="block";break;
|
||||
case __definition: context="definition";break;
|
||||
case __assignment: context="assignment";break;
|
||||
case __function: context="function";break;
|
||||
|
|
Loading…
Reference in New Issue