Add one-operator +-! & add new element in ast_node

This commit is contained in:
Valk Richard Li 2019-10-07 09:42:02 -05:00 committed by GitHub
parent b1d7e4b938
commit a9ca813b72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 9 deletions

View File

@ -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)
{

View File

@ -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')

View File

@ -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:

View File

@ -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;