From 0fe904deeb0360f5fb97449f84b0da708c7082a0 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 13 Nov 2019 23:37:32 +0800 Subject: [PATCH] finish value search --- balloon/abstract_syntax_tree.cpp | 122 +++++++++++++++++++++---------- balloon/abstract_syntax_tree.h | 16 ++++ balloon/balloon_parse.h | 48 +++++++++++- balloon/balloon_scope.h | 2 +- balloon/balloon_type.h | 4 +- balloon/balloon_var.h | 1 + 6 files changed, 153 insertions(+), 40 deletions(-) diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index 7121dc8..e6dc5fb 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -27,6 +27,22 @@ var abstract_syntax_tree::calculation() 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); @@ -34,7 +50,7 @@ var abstract_syntax_tree::calculation() if(temp.get_type()!=__var_number) { exit_type=__error_value_type; - std::cout<<">>[Runtime-error] must use a number to use \'!\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use a number to use \'+\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use a number to use \'-\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use a number to use \'-\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use a number to use \'*\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] get number \'NaN\' or \'Inf\'."<>[Runtime-error] line "<>[Runtime-error] must use a number to use \'/\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use a string to use \'~\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use number or string to use \'==\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use same type to use \'==\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use number or string to use \'!=\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use same type to use \'!=\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use number or string to use \'<\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use same type to use \'<\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use number or string to use \'>\' but use \'"; + std::cout<<">>[Runtime-error] line "<\' but use \'"; print_scalar(left_child.get_type()); std::cout<<"\'."<>[Runtime-error] must use same type to use \'>\' but use \'"; + std::cout<<">>[Runtime-error] line "<\' but use \'"; print_scalar(left_child.get_type()); std::cout<<"\' and \'"; print_scalar(right_child.get_type()); @@ -287,7 +303,7 @@ var abstract_syntax_tree::calculation() else { exit_type=__error_value_type; - std::cout<<">>[Runtime-error] must use number or string to use \'<=\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use same type to use \'<=\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use number or string to use \'>=\' but use \'"; + std::cout<<">>[Runtime-error] line "<=\' but use \'"; print_scalar(left_child.get_type()); std::cout<<"\'."<>[Runtime-error] must use same type to use \'>=\' but use \'"; + std::cout<<">>[Runtime-error] line "<=\' but use \'"; print_scalar(left_child.get_type()); std::cout<<"\' and \'"; print_scalar(right_child.get_type()); @@ -341,7 +357,7 @@ var abstract_syntax_tree::calculation() else { exit_type=__error_value_type; - std::cout<<">>[Runtime-error] must use same type to use \'or\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] must use same type to use \'and\' but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] error type occurred when doing calculation."<>[Runtime-error] line "<>[Runtime-error] must use a number to make a choice but use \'"; + std::cout<<">>[Runtime-error] line "<>[Runtime-error] cannot find a var named \'"<>[Runtime-error] line "<>[Runtime-error] "; + std::cout<<">>[Runtime-error] line "<type); - std::cout<<":incorrect 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] "; + std::cout<<">>[Runtime-error] line "<type); - std::cout<<":incorrect 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; @@ -479,7 +524,7 @@ var abstract_syntax_tree::get_value() temp.set_function(*this); else { - std::cout<<">>[Runtime-error] incorrect value."<>[Runtime-error] line "<::iterator i=children.begin();i!=children.end();++i) { @@ -508,7 +554,7 @@ void abstract_syntax_tree::run_root() } else { - std::cout<<">>[Runtime-error] redeclaration of \'"<<_name<<"\'."<>[Runtime-error] line "<>[Runtime-error] redeclaration of \'"<<_name<<"\'."<>[Runtime-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<