Update
This commit is contained in:
parent
ab0e3c8447
commit
1ddbf43083
|
@ -117,58 +117,10 @@ class var
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class var_scope
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
std::list<var> var_list;
|
|
||||||
public:
|
|
||||||
var_scope()
|
|
||||||
{
|
|
||||||
var_list.clear();
|
|
||||||
var null_var;
|
|
||||||
std::string null_name_str="$";
|
|
||||||
null_var.set_name(null_name_str);
|
|
||||||
var_list.push_back(null_var);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var_scope(const var_scope& p)
|
|
||||||
{
|
|
||||||
var_list=p.var_list;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
void add_var(var& tmp)
|
|
||||||
{
|
|
||||||
for(auto i=var_list.begin();i!=var_list.end();++i)
|
|
||||||
if(i->get_name()==tmp.get_name())
|
|
||||||
{
|
|
||||||
std::cout<<">>[Runtime-error] redeclaration of '"<<tmp.get_name()<<"'."<<std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var_list.push_back(tmp);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
void del_latest_var()
|
|
||||||
{
|
|
||||||
var_list.pop_back();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::list<var>& get_list()
|
|
||||||
{
|
|
||||||
return var_list;
|
|
||||||
}
|
|
||||||
var& search_var(std::string& str)
|
|
||||||
{
|
|
||||||
for(auto i=var_list.begin();i!=var_list.end();++i)
|
|
||||||
if(i->get_name()==str)
|
|
||||||
return *i;
|
|
||||||
std::cout<<">>[Runtime-error] '"<<str<<"' is not delclared in this scope."<<std::endl;
|
|
||||||
return *var_list.begin();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
class var_scope_manager
|
class var_scope_manager
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::list<var_scope> scope_list;
|
std::list<std::list<var>> scope_list;
|
||||||
var error_var;
|
var error_var;
|
||||||
public:
|
public:
|
||||||
var_scope_manager()
|
var_scope_manager()
|
||||||
|
@ -185,8 +137,8 @@ class var_scope_manager
|
||||||
}
|
}
|
||||||
var& search_var(std::string str)
|
var& search_var(std::string str)
|
||||||
{
|
{
|
||||||
for(std::list<var_scope>::iterator i=scope_list.begin();i!=scope_list.end();++i)
|
for(std::list<std::list<var>>::iterator i=scope_list.begin();i!=scope_list.end();++i)
|
||||||
for(std::list<var>::iterator j=i->get_list().begin();j!=i->get_list().end();++j)
|
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
|
||||||
if(j->get_name()==str)
|
if(j->get_name()==str)
|
||||||
return *j;
|
return *j;
|
||||||
std::cout<<">>[Runtime] could not find the var named '"<<str<<"' ."<<std::endl;
|
std::cout<<">>[Runtime] could not find the var named '"<<str<<"' ."<<std::endl;
|
||||||
|
@ -194,18 +146,18 @@ class var_scope_manager
|
||||||
}
|
}
|
||||||
void add_var(var new_var)
|
void add_var(var new_var)
|
||||||
{
|
{
|
||||||
for(std::list<var_scope>::iterator i=scope_list.begin();i!=scope_list.end();++i)
|
for(std::list<std::list<var>>::iterator i=scope_list.begin();i!=scope_list.end();++i)
|
||||||
for(std::list<var>::iterator j=i->get_list().begin();j!=i->get_list().end();++j)
|
for(std::list<var>::iterator j=i->begin();j!=i->end();++j)
|
||||||
if(j->get_name()==new_var.get_name())
|
if(j->get_name()==new_var.get_name())
|
||||||
{
|
{
|
||||||
std::cout<<">>[Runtime] redefinition of var '"<<new_var.get_name()<<"' ."<<std::endl;
|
std::cout<<">>[Runtime] redeclaration of var '"<<new_var.get_name()<<"' ."<<std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(!scope_list.empty())
|
if(!scope_list.empty())
|
||||||
{
|
{
|
||||||
std::list<var_scope>::iterator i=scope_list.end();
|
std::list<std::list<var>>::iterator i=scope_list.end();
|
||||||
--i;
|
--i;
|
||||||
i->get_list().push_back(new_var);
|
i->push_back(new_var);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
std::cout<<">>[Runtime] empty scope list."<<std::endl;
|
std::cout<<">>[Runtime] empty scope list."<<std::endl;
|
||||||
|
@ -213,8 +165,8 @@ class var_scope_manager
|
||||||
}
|
}
|
||||||
void add_new_scope()
|
void add_new_scope()
|
||||||
{
|
{
|
||||||
var_scope new_scope;
|
std::list<var> new_list;
|
||||||
scope_list.push_back(new_scope);
|
scope_list.push_back(new_list);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void pop_last_scope()
|
void pop_last_scope()
|
||||||
|
@ -231,6 +183,7 @@ class nasal_runtime
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
abstract_syntax_tree root;
|
abstract_syntax_tree root;
|
||||||
|
var_scope_manager scope;
|
||||||
public:
|
public:
|
||||||
nasal_runtime()
|
nasal_runtime()
|
||||||
{
|
{
|
||||||
|
@ -254,7 +207,7 @@ class nasal_runtime
|
||||||
std::cout<<">>[Runtime] runtime got the ast-root: "<<((void *)&tree)<<"->"<<((void *)&root)<<"."<<std::endl;
|
std::cout<<">>[Runtime] runtime got the ast-root: "<<((void *)&tree)<<"->"<<((void *)&root)<<"."<<std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var run_definition(abstract_syntax_tree& tree);
|
void run_definition(abstract_syntax_tree& tree);
|
||||||
void run_assignment(abstract_syntax_tree& tree);
|
void run_assignment(abstract_syntax_tree& tree);
|
||||||
void run_loop(abstract_syntax_tree& tree);
|
void run_loop(abstract_syntax_tree& tree);
|
||||||
void run_if_else(abstract_syntax_tree& tree);
|
void run_if_else(abstract_syntax_tree& tree);
|
||||||
|
@ -268,6 +221,7 @@ class nasal_runtime
|
||||||
|
|
||||||
void nasal_runtime::run_root(abstract_syntax_tree& tree)
|
void nasal_runtime::run_root(abstract_syntax_tree& tree)
|
||||||
{
|
{
|
||||||
|
scope.add_new_scope();
|
||||||
if(!tree.get_children().empty())
|
if(!tree.get_children().empty())
|
||||||
{
|
{
|
||||||
for(std::list<abstract_syntax_tree>::iterator i=tree.get_children().begin();i!=tree.get_children().end();++i)
|
for(std::list<abstract_syntax_tree>::iterator i=tree.get_children().begin();i!=tree.get_children().end();++i)
|
||||||
|
@ -316,29 +270,80 @@ void nasal_runtime::run_root(abstract_syntax_tree& tree)
|
||||||
case __number:
|
case __number:
|
||||||
case __string:
|
case __string:
|
||||||
scalar_call(*i);
|
scalar_call(*i);
|
||||||
return;
|
break;
|
||||||
default:
|
default:
|
||||||
std::cout<<">>[Debug] error occurred."<<std::endl;
|
std::cout<<">>[Debug] error occurred."<<std::endl;
|
||||||
|
scope.pop_last_scope();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
scope.pop_last_scope();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var nasal_runtime::run_definition(abstract_syntax_tree& tree)
|
void nasal_runtime::run_definition(abstract_syntax_tree& tree)
|
||||||
{
|
{
|
||||||
var new_var;
|
var new_var;
|
||||||
std::list<abstract_syntax_tree>::iterator iter=tree.get_children().begin();
|
std::list<abstract_syntax_tree>::iterator iter=tree.get_children().begin();
|
||||||
new_var.set_name(iter->get_var_name());
|
std::string var_name=iter->get_var_name();
|
||||||
++iter;
|
++iter;
|
||||||
if(iter==tree.get_children().end())
|
if(iter==tree.get_children().end())
|
||||||
{
|
{
|
||||||
new_var.set_type(__null_type);
|
new_var.set_type(__null_type);
|
||||||
|
new_var.set_name(var_name);
|
||||||
return new_var;
|
scope.add_var(new_var);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return new_var;
|
else
|
||||||
|
{
|
||||||
|
switch(iter->get_type())
|
||||||
|
{
|
||||||
|
case __add_operator:
|
||||||
|
case __sub_operator:
|
||||||
|
case __mul_operator:
|
||||||
|
case __div_operator:
|
||||||
|
case __link_operator:
|
||||||
|
case __and_operator:
|
||||||
|
case __or_operator:
|
||||||
|
case __nor_operator:
|
||||||
|
case __cmp_equal:
|
||||||
|
case __cmp_not_equal:
|
||||||
|
case __cmp_less:
|
||||||
|
case __cmp_less_or_equal:
|
||||||
|
case __cmp_more:
|
||||||
|
case __cmp_more_or_equal:
|
||||||
|
new_var=run_calculation(*iter);
|
||||||
|
break;
|
||||||
|
case __call_function:
|
||||||
|
new_var=run_function(*iter);
|
||||||
|
break;
|
||||||
|
case __id:
|
||||||
|
case __hash_search:
|
||||||
|
case __list_search:
|
||||||
|
new_var=identifier_call(*iter);
|
||||||
|
break;
|
||||||
|
case __number:
|
||||||
|
case __string:
|
||||||
|
new_var=scalar_call(*iter);
|
||||||
|
break;
|
||||||
|
case __function:
|
||||||
|
;
|
||||||
|
break;
|
||||||
|
case __list:
|
||||||
|
break;
|
||||||
|
case __hash:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
std::cout<<">>[Debug] error occurred."<<std::endl;
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
new_var.set_name(var_name);
|
||||||
|
scope.add_var(new_var);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
void nasal_runtime::run_assignment(abstract_syntax_tree& tree)
|
void nasal_runtime::run_assignment(abstract_syntax_tree& tree)
|
||||||
{
|
{
|
||||||
|
@ -354,6 +359,9 @@ void nasal_runtime::run_if_else(abstract_syntax_tree& tree)
|
||||||
}
|
}
|
||||||
void nasal_runtime::run_block(abstract_syntax_tree& tree)
|
void nasal_runtime::run_block(abstract_syntax_tree& tree)
|
||||||
{
|
{
|
||||||
|
scope.add_new_scope();
|
||||||
|
|
||||||
|
scope.pop_last_scope();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue