update
This commit is contained in:
parent
3d87602582
commit
cb6f4cad4f
|
@ -4,12 +4,17 @@
|
||||||
class abstract_syntax_tree
|
class abstract_syntax_tree
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
// basic elements
|
||||||
int line;
|
int line;
|
||||||
int type;
|
int node_type;
|
||||||
double number;
|
|
||||||
std::string str;
|
|
||||||
std::string name;
|
|
||||||
std::list<abstract_syntax_tree> children;
|
std::list<abstract_syntax_tree> children;
|
||||||
|
|
||||||
|
// is this node is a number|string|identifier node
|
||||||
|
// then the three elements below is of great use
|
||||||
|
double var_number;
|
||||||
|
std::string var_string;
|
||||||
|
std::string var_name;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// basic
|
// basic
|
||||||
abstract_syntax_tree();
|
abstract_syntax_tree();
|
||||||
|
@ -23,41 +28,41 @@ class abstract_syntax_tree
|
||||||
|
|
||||||
// set
|
// set
|
||||||
void set_clear();
|
void set_clear();
|
||||||
void set_type(const int);
|
void set_node_type(const int);
|
||||||
void set_line(const int);
|
void set_node_line(const int);
|
||||||
void set_string(std::string);
|
void set_var_string(std::string);
|
||||||
void set_number(std::string);
|
void set_var_number(std::string);
|
||||||
void set_name(std::string);
|
void set_var_name(std::string);
|
||||||
void add_child(abstract_syntax_tree);
|
void add_children(abstract_syntax_tree);
|
||||||
|
|
||||||
// get
|
// get
|
||||||
int get_type();
|
int get_node_type();
|
||||||
int get_line();
|
int get_node_line();
|
||||||
double get_number();
|
double get_var_number();
|
||||||
std::string get_string();
|
std::string get_var_string();
|
||||||
std::string get_name();
|
std::string get_var_name();
|
||||||
std::list<abstract_syntax_tree>& get_children();
|
std::list<abstract_syntax_tree>& get_children();
|
||||||
};
|
};
|
||||||
|
|
||||||
abstract_syntax_tree::abstract_syntax_tree()
|
abstract_syntax_tree::abstract_syntax_tree()
|
||||||
{
|
{
|
||||||
type=0;
|
node_type=__null_type;
|
||||||
line=0;
|
line=0;
|
||||||
number=0;
|
var_number=0;
|
||||||
str="";
|
var_string="";
|
||||||
name="";
|
var_name="";
|
||||||
children.clear();
|
children.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract_syntax_tree::abstract_syntax_tree(const abstract_syntax_tree& p)
|
abstract_syntax_tree::abstract_syntax_tree(const abstract_syntax_tree& tmp)
|
||||||
{
|
{
|
||||||
type=p.type;
|
node_type=tmp.node_type;
|
||||||
line=p.line;
|
line=tmp.line;
|
||||||
number=p.number;
|
var_number=tmp.var_number;
|
||||||
str=p.str;
|
var_string=tmp.var_string;
|
||||||
name=p.name;
|
var_name=tmp.var_name;
|
||||||
children=p.children;
|
children=tmp.children;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,15 +72,15 @@ abstract_syntax_tree::~abstract_syntax_tree()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract_syntax_tree& abstract_syntax_tree::operator=(const abstract_syntax_tree& p)
|
abstract_syntax_tree& abstract_syntax_tree::operator=(const abstract_syntax_tree& tmp)
|
||||||
{
|
{
|
||||||
type=p.type;
|
node_type=tmp.node_type;
|
||||||
line=p.line;
|
line=tmp.line;
|
||||||
number=p.number;
|
var_number=tmp.var_number;
|
||||||
str=p.str;
|
var_string=tmp.var_string;
|
||||||
name=p.name;
|
var_name=tmp.var_name;
|
||||||
children.clear();
|
children.clear();
|
||||||
children=p.children;
|
children=tmp.children;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,16 +90,16 @@ void abstract_syntax_tree::print_tree(const int n)
|
||||||
for(int i=0;i<n;++i)
|
for(int i=0;i<n;++i)
|
||||||
__str+="| ";
|
__str+="| ";
|
||||||
std::cout<<__str;
|
std::cout<<__str;
|
||||||
print_parse_token(type);
|
print_parse_token(node_type);
|
||||||
switch(type)
|
switch(node_type)
|
||||||
{
|
{
|
||||||
case __number:std::cout<<": "<<number;break;
|
case __number:std::cout<<": "<<var_number;break;
|
||||||
case __string:std::cout<<": "<<str;break;
|
case __string:std::cout<<": "<<var_string;break;
|
||||||
case __id:
|
case __id:
|
||||||
case __dynamic_id:
|
case __dynamic_id:
|
||||||
case __call_array:
|
case __call_array:
|
||||||
case __call_hash:
|
case __call_hash:
|
||||||
case __call_function:std::cout<<": "<<name;break;
|
case __call_function:std::cout<<": "<<var_name;break;
|
||||||
}
|
}
|
||||||
std::cout<<std::endl;
|
std::cout<<std::endl;
|
||||||
if(!children.empty())
|
if(!children.empty())
|
||||||
|
@ -107,22 +112,22 @@ void abstract_syntax_tree::print_tree(const int n)
|
||||||
|
|
||||||
void abstract_syntax_tree::set_clear()
|
void abstract_syntax_tree::set_clear()
|
||||||
{
|
{
|
||||||
type=0;
|
node_type=__null_type;
|
||||||
line=0;
|
line=0;
|
||||||
number=0;
|
var_number=0;
|
||||||
str="";
|
var_string="";
|
||||||
name="";
|
var_name="";
|
||||||
children.clear();
|
children.clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::set_type(const int __type)
|
void abstract_syntax_tree::set_node_type(const int __node_type)
|
||||||
{
|
{
|
||||||
type=__type;
|
node_type=__node_type;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::set_line(const int __line)
|
void abstract_syntax_tree::set_node_line(const int __line)
|
||||||
{
|
{
|
||||||
if(__line>=0)
|
if(__line>=0)
|
||||||
line=__line;
|
line=__line;
|
||||||
|
@ -134,25 +139,25 @@ void abstract_syntax_tree::set_line(const int __line)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::set_string(std::string __str)
|
void abstract_syntax_tree::set_var_string(std::string __str)
|
||||||
{
|
{
|
||||||
str=__str;
|
var_string=__str;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::set_number(std::string __str)
|
void abstract_syntax_tree::set_var_number(std::string __str)
|
||||||
{
|
{
|
||||||
number=trans_string_to_number(__str);
|
var_number=trans_string_to_number(__str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::set_name(std::string __str)
|
void abstract_syntax_tree::set_var_name(std::string __str)
|
||||||
{
|
{
|
||||||
name=__str;
|
var_name=__str;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void abstract_syntax_tree::add_child(abstract_syntax_tree p)
|
void abstract_syntax_tree::add_children(abstract_syntax_tree p)
|
||||||
{
|
{
|
||||||
// use abstract_syntax_tree instead of abstract_syntax_tree&
|
// use abstract_syntax_tree instead of abstract_syntax_tree&
|
||||||
// because when this function get a 'p' from returned value of
|
// because when this function get a 'p' from returned value of
|
||||||
|
@ -161,29 +166,29 @@ void abstract_syntax_tree::add_child(abstract_syntax_tree p)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int abstract_syntax_tree::get_type()
|
int abstract_syntax_tree::get_node_type()
|
||||||
{
|
{
|
||||||
return type;
|
return node_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
int abstract_syntax_tree::get_line()
|
int abstract_syntax_tree::get_node_line()
|
||||||
{
|
{
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
double abstract_syntax_tree::get_number()
|
double abstract_syntax_tree::get_var_number()
|
||||||
{
|
{
|
||||||
return number;
|
return var_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string abstract_syntax_tree::get_string()
|
std::string abstract_syntax_tree::get_var_string()
|
||||||
{
|
{
|
||||||
return str;
|
return var_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string abstract_syntax_tree::get_name()
|
std::string abstract_syntax_tree::get_var_name()
|
||||||
{
|
{
|
||||||
return name;
|
return var_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<abstract_syntax_tree>& abstract_syntax_tree::get_children()
|
std::list<abstract_syntax_tree>& abstract_syntax_tree::get_children()
|
||||||
|
|
|
@ -134,8 +134,8 @@ void nasal_parse::main_generate()
|
||||||
warning=0;
|
warning=0;
|
||||||
// initialize error and warning
|
// initialize error and warning
|
||||||
root.set_clear();
|
root.set_clear();
|
||||||
root.set_line(1);
|
root.set_node_line(1);
|
||||||
root.set_type(__root);
|
root.set_node_type(__root);
|
||||||
// initialize root node
|
// initialize root node
|
||||||
while(parse_token_stream.top().type!=__stack_end)
|
while(parse_token_stream.top().type!=__stack_end)
|
||||||
{
|
{
|
||||||
|
@ -151,15 +151,15 @@ void nasal_parse::main_generate()
|
||||||
case __left_curve: case __left_bracket: case __left_brace:
|
case __left_curve: case __left_bracket: case __left_brace:
|
||||||
case __func:
|
case __func:
|
||||||
this->push_token();
|
this->push_token();
|
||||||
root.add_child(scalar_generate());
|
root.add_children(scalar_generate());
|
||||||
break;
|
break;
|
||||||
case __if:
|
case __if:
|
||||||
this->push_token();
|
this->push_token();
|
||||||
root.add_child(choose_expr());
|
root.add_children(choose_expr());
|
||||||
break;
|
break;
|
||||||
case __while: case __for: case __foreach: case __forindex:
|
case __while: case __for: case __foreach: case __forindex:
|
||||||
this->push_token();
|
this->push_token();
|
||||||
root.add_child(loop_expr());
|
root.add_children(loop_expr());
|
||||||
break;
|
break;
|
||||||
case __semi:break;
|
case __semi:break;
|
||||||
case __stack_end:break;
|
case __stack_end:break;
|
||||||
|
@ -177,7 +177,7 @@ abstract_syntax_tree nasal_parse::scalar_generate()
|
||||||
{
|
{
|
||||||
this->get_token();
|
this->get_token();
|
||||||
abstract_syntax_tree scalar_node;
|
abstract_syntax_tree scalar_node;
|
||||||
scalar_node.set_line(this_token.line);
|
scalar_node.set_node_line(this_token.line);
|
||||||
switch(this_token.type)
|
switch(this_token.type)
|
||||||
{
|
{
|
||||||
case __nor_operator:
|
case __nor_operator:
|
||||||
|
@ -205,32 +205,32 @@ abstract_syntax_tree nasal_parse::function_generate()
|
||||||
abstract_syntax_tree function_node;
|
abstract_syntax_tree function_node;
|
||||||
abstract_syntax_tree parameter_list;
|
abstract_syntax_tree parameter_list;
|
||||||
this->get_token(); // get 'func'
|
this->get_token(); // get 'func'
|
||||||
function_node.set_type(__function);
|
function_node.set_node_type(__function);
|
||||||
function_node.set_line(this_token.line);
|
function_node.set_node_line(this_token.line);
|
||||||
parameter_list.set_type(__parameters);
|
parameter_list.set_node_type(__parameters);
|
||||||
parameter_list.set_line(this_token.line);
|
parameter_list.set_node_line(this_token.line);
|
||||||
return function_node;
|
return function_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract_syntax_tree nasal_parse::var_outside_definition()
|
abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
{
|
{
|
||||||
abstract_syntax_tree var_outsied_definition_node;
|
abstract_syntax_tree var_outsied_definition_node;
|
||||||
var_outsied_definition_node.set_type(__definition);
|
var_outsied_definition_node.set_node_type(__definition);
|
||||||
this->get_token();// get 'var'
|
this->get_token();// get 'var'
|
||||||
var_outsied_definition_node.set_line(this_token.line);
|
var_outsied_definition_node.set_node_line(this_token.line);
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type==__id)
|
if(this_token.type==__id)
|
||||||
{
|
{
|
||||||
abstract_syntax_tree new_var_identifier;
|
abstract_syntax_tree new_var_identifier;
|
||||||
new_var_identifier.set_type(__id);
|
new_var_identifier.set_node_type(__id);
|
||||||
new_var_identifier.set_line(this_token.line);
|
new_var_identifier.set_node_line(this_token.line);
|
||||||
new_var_identifier.set_name(this_token.str);
|
new_var_identifier.set_var_name(this_token.str);
|
||||||
var_outsied_definition_node.add_child(new_var_identifier);
|
var_outsied_definition_node.add_children(new_var_identifier);
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type==__semi)
|
if(this_token.type==__semi)
|
||||||
this->push_token();// var id
|
this->push_token();// var id
|
||||||
else if(this_token.type==__equal)
|
else if(this_token.type==__equal)
|
||||||
var_outsied_definition_node.add_child(scalar_generate());// var id = scalar
|
var_outsied_definition_node.add_children(scalar_generate());// var id = scalar
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->push_token();
|
this->push_token();
|
||||||
|
@ -241,8 +241,8 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
else if(this_token.type==__left_curve)
|
else if(this_token.type==__left_curve)
|
||||||
{
|
{
|
||||||
abstract_syntax_tree multi_identifier;
|
abstract_syntax_tree multi_identifier;
|
||||||
multi_identifier.set_type(__multi_id);
|
multi_identifier.set_node_type(__multi_id);
|
||||||
multi_identifier.set_line(this_token.line);
|
multi_identifier.set_node_line(this_token.line);
|
||||||
while(this_token.type!=__right_curve)
|
while(this_token.type!=__right_curve)
|
||||||
{
|
{
|
||||||
this->get_token();
|
this->get_token();
|
||||||
|
@ -256,7 +256,7 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->push_token();
|
this->push_token();
|
||||||
multi_identifier.add_child(scalar_generate());
|
multi_identifier.add_children(scalar_generate());
|
||||||
}
|
}
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type!=__semi && this_token.type!=__right_curve)
|
if(this_token.type!=__semi && this_token.type!=__right_curve)
|
||||||
|
@ -267,7 +267,7 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var_outsied_definition_node.add_child(multi_identifier);
|
var_outsied_definition_node.add_children(multi_identifier);
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type==__semi)
|
if(this_token.type==__semi)
|
||||||
this->push_token();// var (id,id,id)
|
this->push_token();// var (id,id,id)
|
||||||
|
@ -294,19 +294,19 @@ abstract_syntax_tree nasal_parse::var_outside_definition()
|
||||||
abstract_syntax_tree nasal_parse::var_inside_definition()
|
abstract_syntax_tree nasal_parse::var_inside_definition()
|
||||||
{
|
{
|
||||||
abstract_syntax_tree var_inside_definition_node;
|
abstract_syntax_tree var_inside_definition_node;
|
||||||
var_inside_definition_node.set_type(__definition);
|
var_inside_definition_node.set_node_type(__definition);
|
||||||
this->get_token(); // get '('
|
this->get_token(); // get '('
|
||||||
this->get_token(); // get 'var'
|
this->get_token(); // get 'var'
|
||||||
var_inside_definition_node.set_line(this_token.line);
|
var_inside_definition_node.set_node_line(this_token.line);
|
||||||
return var_inside_definition_node;
|
return var_inside_definition_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract_syntax_tree nasal_parse::loop_expr()
|
abstract_syntax_tree nasal_parse::loop_expr()
|
||||||
{
|
{
|
||||||
abstract_syntax_tree loop_main_node;
|
abstract_syntax_tree loop_main_node;
|
||||||
loop_main_node.set_type(__loop);
|
loop_main_node.set_node_type(__loop);
|
||||||
this->get_token(); // get the first token of loop
|
this->get_token(); // get the first token of loop
|
||||||
loop_main_node.set_line(this_token.line);
|
loop_main_node.set_node_line(this_token.line);
|
||||||
switch(this_token.type)
|
switch(this_token.type)
|
||||||
{
|
{
|
||||||
case __for:
|
case __for:
|
||||||
|
@ -323,19 +323,19 @@ abstract_syntax_tree nasal_parse::choose_expr()
|
||||||
abstract_syntax_tree if_node;
|
abstract_syntax_tree if_node;
|
||||||
abstract_syntax_tree elsif_node;
|
abstract_syntax_tree elsif_node;
|
||||||
abstract_syntax_tree else_node;
|
abstract_syntax_tree else_node;
|
||||||
choose_main_node.set_type(__ifelse);
|
choose_main_node.set_node_type(__ifelse);
|
||||||
// get 'if'
|
// get 'if'
|
||||||
this->get_token();
|
this->get_token();
|
||||||
choose_main_node.set_line(this_token.line);
|
choose_main_node.set_node_line(this_token.line);
|
||||||
if_node.set_type(__if);
|
if_node.set_node_type(__if);
|
||||||
if_node.set_line(this_token.line);
|
if_node.set_node_line(this_token.line);
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type!=__left_curve)
|
if(this_token.type!=__left_curve)
|
||||||
{
|
{
|
||||||
++error;
|
++error;
|
||||||
print_parse_error(lack_left_curve,this_token.line);
|
print_parse_error(lack_left_curve,this_token.line);
|
||||||
}
|
}
|
||||||
if_node.add_child(scalar_generate());
|
if_node.add_children(scalar_generate());
|
||||||
this->get_token();
|
this->get_token();
|
||||||
if(this_token.type!=__right_curve)
|
if(this_token.type!=__right_curve)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue