diff --git a/abstract_syntax_tree.cpp b/abstract_syntax_tree.cpp deleted file mode 100644 index e6dc5fb..0000000 --- a/abstract_syntax_tree.cpp +++ /dev/null @@ -1,757 +0,0 @@ -#ifndef __ABSTRACT_SYNTAX_TREE_CPP__ -#define __ABSTRACT_SYNTAX_TREE_CPP__ -#include "abstract_syntax_tree.h" - - -int exit_type=0; -std::stack ret_stack;// for function ret use - -var abstract_syntax_tree::calculation() -{ - var temp; - temp.set_type(__null_type); - if(this->type==__number) - { - temp.set_type(__var_number); - temp.set_number(number); - return temp; - } - else if(this->type==__string) - { - temp.set_type(__var_string); - temp.set_string(str); - return temp; - } - else if(this->type==__id) - { - temp=this->call_identifier(); - return temp; - } - else if(this->type==__array) - { - temp=this->array_generation(); - return temp; - } - else if(this->type==__hash) - { - temp=this->hash_generation(); - return temp; - } - else if(this->type==__function) - { - temp.set_type(__function); - temp.set_function(*this); - return temp; - } - if(this->type==__nor_operator) - { - temp.set_type(__var_number); - temp=children.front().calculation(); - if(temp.get_type()!=__var_number) - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type==__add_operator) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_number && right_child.get_type()==__var_number) - temp.set_number(left_child.get_number()+right_child.get_number()); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type==__sub_operator) - { - temp.set_type(__var_number); - std::list::iterator i=children.begin(); - ++i; - if(i==children.end()) - { - temp=children.front().calculation(); - if(temp.get_type()==__var_number) - temp.set_number(temp.get_number()*(-1)); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<type==__mul_operator) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_number && right_child.get_type()==__var_number) - temp.set_number(left_child.get_number()*right_child.get_number()); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type==__div_operator) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_number && right_child.get_type()==__var_number) - { - temp.set_number(left_child.get_number()/right_child.get_number()); - if(std::isnan(temp.get_number()) || std::isinf(temp.get_number())) - { - exit_type=__sigfpe_arithmetic_exception; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<type==__link_operator) - { - temp.set_type(__var_string); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_string && right_child.get_type()==__var_string) - temp.set_string(left_child.get_string()+right_child.get_string()); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type==__cmp_equal) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()==right_child.get_number())); - else if(left_child.get_type()==__var_string) - temp.set_number((double)(left_child.get_string()==right_child.get_string())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<type==__cmp_not_equal) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()!=right_child.get_number())); - else if(left_child.get_type()==__var_string) - temp.set_number((double)(left_child.get_string()!=right_child.get_string())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<type==__cmp_less) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()>[Runtime-error] line "<>[Runtime-error] line "<type==__cmp_more) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()>right_child.get_number())); - else if(left_child.get_type()==__var_string) - temp.set_number((double)(left_child.get_string()>right_child.get_string())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<\' but use \'"; - print_scalar(left_child.get_type()); - std::cout<<"\'."<>[Runtime-error] line "<\' but use \'"; - print_scalar(left_child.get_type()); - std::cout<<"\' and \'"; - print_scalar(right_child.get_type()); - std::cout<<"\'."<type==__cmp_less_or_equal) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()<=right_child.get_number())); - else if(left_child.get_type()==__var_string) - temp.set_number((double)(left_child.get_string()<=right_child.get_string())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<type==__cmp_more_or_equal) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==right_child.get_type()) - { - if(left_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number()>=right_child.get_number())); - else if(left_child.get_type()==__var_string) - temp.set_number((double)(left_child.get_string()>=right_child.get_string())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<=\' but use \'"; - print_scalar(left_child.get_type()); - std::cout<<"\'."<>[Runtime-error] line "<=\' but use \'"; - print_scalar(left_child.get_type()); - std::cout<<"\' and \'"; - print_scalar(right_child.get_type()); - std::cout<<"\'."<type==__or_operator) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_number && right_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number() || right_child.get_number())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type==__and_operator) - { - temp.set_type(__var_number); - var left_child=children.front().calculation(); - var right_child=children.back().calculation(); - if(left_child.get_type()==__var_number && right_child.get_type()==__var_number) - temp.set_number((double)(left_child.get_number() && right_child.get_number())); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<>[Runtime-error] line "<>[Runtime-error] line "<>[Runtime-error] line "<::iterator i=children.begin();i!=children.end();++i) - { - if(i->type==__call_array && temp.get_type()==__var_array) - { - var place=i->children.front().calculation(); - if(place.get_type()==__var_number) - temp=temp.get_array_member((int)place.get_number()); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type); - std::cout<<": incorrect type \'"; - print_scalar(temp.get_type()); - std::cout<<"\'."<type==__call_hash && temp.get_type()==__var_hash) - { - temp=temp.get_hash_member(i->name); - if(temp.get_type()==__null_type) - { - exit_type=__get_value_failure; - std::cout<<">>[Runtime-error] line "<name<<"\'."<type==__call_function && temp.get_type()==__var_function) - temp=temp.get_function().run_func(); - else - { - exit_type=__error_value_type; - std::cout<<">>[Runtime-error] line "<type); - std::cout<<": incorrect type \'"; - print_scalar(temp.get_type()); - std::cout<<"\'."<::iterator i=children.begin();i!=children.end();++i) - new_var.append_array(i->calculation()); - return new_var; -} - -var abstract_syntax_tree::hash_generation() -{ - var new_var; - new_var.set_type(__var_hash); - if(!children.empty()) - for(std::list::iterator i=children.begin();i!=children.end();++i) - { - var temp; - temp=i->children.front().calculation(); - temp.set_name(i->name); - new_var.append_hash(temp); - } - return new_var; -} - -var abstract_syntax_tree::get_value() -{ - var temp; - temp.set_type(type); - if(type==__id) - temp=call_identifier(); - else if(type==__number) - temp.set_number(number); - else if(type==__string) - temp.set_string(str); - else if(type==__array) - { - var new_var; - for(std::list::iterator i=children.begin();i!=children.end();++i) - { - new_var=i->get_value(); - temp.append_array(new_var); - } - } - else if(type==__hash) - { - var new_var; - for(std::list::iterator i=children.begin();i!=children.end();++i) - { - new_var=i->children.begin()->get_value(); - new_var.set_name(i->name); - temp.append_array(new_var); - } - } - else if(type==__function) - temp.set_function(*this); - else - { - std::cout<<">>[Runtime-error] line "<::iterator i=children.begin();i!=children.end();++i) - { - if(i->type==__definition) - { - var new_var; - std::list::iterator j=i->children.begin(); - std::string _name=j->name; - if(!scope.search_var(_name)) - { - ++j; - if(j!=i->children.end()) - new_var=j->calculation(); - new_var.set_name(_name); - scope.add_new_var(new_var); - } - else - { - std::cout<<">>[Runtime-error] line "<type==__equal || i->type==__add_equal || i->type==__sub_equal || i->type==__mul_equal || i->type==__div_equal || i->type==__link_equal) - { - ; - } - else if(i->type==__add_operator || i->type==__sub_operator || i->type==__mul_operator || i->type==__div_operator || i->type==__link_operator || i->type==__or_operator || i->type==__and_operator || i->type==__nor_operator) - { - var t=i->calculation(); - if(t.get_type()==__var_number) - std::cout<type==__number) - std::cout<number<type==__string) - std::cout<str<type==__id) - { - var t=i->call_identifier(); - if(t.get_type()==__var_number) - std::cout<type==__while) - { - scope.add_new_block_scope(); - i->run_loop(); - scope.pop_last_block_scope(); - } - else if(i->type==__ifelse) - { - scope.add_new_block_scope(); - i->run_ifelse(); - scope.pop_last_block_scope(); - } - if(exit_type!=__process_exited_successfully) - break; - } - end_time=time(NULL); - std::cout<<"--------------------------------------------------------------------------------------"<>[Runtime] process exited after "<::iterator i=children.begin();i!=children.end();++i) - { - if(i->type!=__else && i->children.front().condition_check()) - { - ret=i->children.back().run_block(); - break; - } - else - { - ret=i->children.back().run_block(); - break; - } - } - scope.pop_last_local_scope(); - return ret; -} - -var abstract_syntax_tree::run_func() -{ - var ret; - scope.add_new_block_scope(); - scope.add_new_local_scope(); - - //get return - scope.pop_last_block_scope(); - ret=ret_stack.top(); - ret_stack.pop(); - return ret; -} - -int abstract_syntax_tree::run_block() -{ - scope.add_new_local_scope(); - for(std::list::iterator i=children.begin();i!=children.end();++i) - { - if(i->type==__definition) - { - var new_var; - std::list::iterator j=i->children.begin(); - std::string _name=j->name; - if(!scope.search_var(_name)) - { - ++j; - if(j!=i->children.end()) - new_var=j->calculation(); - new_var.set_name(_name); - scope.add_new_var(new_var); - } - else - { - std::cout<<">>[Runtime-error] line "<type==__number) - std::cout<number<type==__string) - std::cout<str<type==__id) - { - var t=i->call_identifier(); - if(t.get_type()==__var_number) - std::cout<type==__equal || i->type==__add_equal || i->type==__sub_equal || i->type==__mul_equal || i->type==__div_equal || i->type==__link_equal) - { - ; - } - else if(i->type==__add_operator || i->type==__sub_operator || i->type==__mul_operator || i->type==__div_operator || i->type==__link_operator || i->type==__or_operator || i->type==__and_operator || i->type==__nor_operator) - { - var t=i->calculation(); - if(t.get_type()==__var_number) - std::cout<type==__while) - { - int type=i->run_loop(); - if(type) - { - if(type==__return) - return type; - else - { - std::cout<<"[Runtime-error] line "<type==__ifelse) - { - int type=i->run_ifelse(); - if(type) - return type; - } - else if(i->type==__continue) - return __continue; - else if(i->type==__break) - return __break; - else if(i->type==__return) - { - var temp; - temp.set_type(__null_type); - if(!(i->children.empty())) - temp=i->calculation(); - ret_stack.push(temp); - return __return; - } - if(exit_type!=__process_exited_successfully) - break; - } - scope.pop_last_local_scope(); - return 0; -} - - -#endif