From 8502ef20cfeb4b9539ef9e91b6f7797724831e4f Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Thu, 14 Nov 2019 23:21:47 +0800 Subject: [PATCH] update --- balloon/abstract_syntax_tree.cpp | 30 ++++++++++++++++++++++++++---- balloon/abstract_syntax_tree.h | 2 +- balloon/balloon_type.h | 2 ++ balloon/balloon_var.h | 8 ++++---- balloon/lib/math.nas | 2 +- balloon/main.cpp | 3 +++ 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index 4f4b467..c92f247 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -468,10 +468,14 @@ var abstract_syntax_tree::call_identifier() } else if(i->type==__call_function && temp.get_type()==__var_function) { + var self; + self.set_type(__var_function); + self.set_name(temp.get_name()); + self.set_function(temp.get_function()); std::list parameter; for(std::list::iterator j=i->children.begin();j!=i->children.end();++j) parameter.push_back(j->calculation()); - temp=temp.get_function().run_func(parameter); + temp=temp.get_function().run_func(parameter,self); } else { @@ -737,11 +741,23 @@ int abstract_syntax_tree::run_ifelse() return ret; } -var abstract_syntax_tree::run_func(std::list parameter) +var abstract_syntax_tree::run_func(std::list parameter,var self_func) { + static int recursion_depth=0; + ++recursion_depth; + if(recursion_depth>512) + { + exit_type=__sigsegv_segmentation_error; + std::cout<<">>[Runtime-error] line "<::iterator para_name=para.children.begin(); @@ -763,10 +779,11 @@ var abstract_syntax_tree::run_func(std::list parameter) if(exit_type==__process_exited_successfully) { int _t=blk.run_block(); + // in case the exit_type is not __process_exited_successfully in run_block + // or the function does not have return value; if(_t!=__return) ret_stack.push(error_var); } - else ret_stack.push(error_var); @@ -774,7 +791,7 @@ var abstract_syntax_tree::run_func(std::list parameter) scope.pop_last_block_scope(); ret=ret_stack.top(); ret_stack.pop(); - + --recursion_depth; return ret; } @@ -793,6 +810,11 @@ int abstract_syntax_tree::run_block() ++j; if(j!=i->children.end()) new_var=j->calculation(); + if(new_var.get_type()==__var_function) + { + exit_type=__bad_definition; + std::cout<<">>[Runtime-error] line "<); + var run_func(std::list,var); int run_block(); }; diff --git a/balloon/balloon_type.h b/balloon/balloon_type.h index c099ed3..8e4cbbd 100644 --- a/balloon/balloon_type.h +++ b/balloon/balloon_type.h @@ -175,6 +175,7 @@ enum runtime_error_type __find_var_failure, __error_value_type, __error_command_use, + __bad_definition, __sigfpe_arithmetic_exception, __sigsegv_segmentation_error, __terminal_interrupt, @@ -192,6 +193,7 @@ void print_exit_type(int type) case __find_var_failure: context="find_var_failure";break; case __error_value_type: context="value_type_error";break; case __error_command_use: context="command_use_error(continue/break/return)";break; + case __bad_definition: context="bad_definition(func in block)";break; case __sigfpe_arithmetic_exception: context="SIGFPE_arithmetic_exception";break; case __sigsegv_segmentation_error: context="SIGSEGV_segmentation_error";break; case __terminal_interrupt: context="interrupt";break; diff --git a/balloon/balloon_var.h b/balloon/balloon_var.h index afb7f8e..b91044f 100644 --- a/balloon/balloon_var.h +++ b/balloon/balloon_var.h @@ -59,7 +59,7 @@ class var void set_name(std::string); void set_number(double); void set_string(std::string); - void set_function(abstract_syntax_tree&); + void set_function(abstract_syntax_tree); void append_array(var); void append_hash(var); int get_type(); @@ -70,7 +70,7 @@ class var var* get_array_member_addr(int); var get_hash_member(std::string); var* get_hash_member_addr(std::string); - abstract_syntax_tree& get_function(); + abstract_syntax_tree get_function(); }; var error_var; @@ -99,7 +99,7 @@ void var::set_string(std::string _str) return; } -void var::set_function(abstract_syntax_tree& p) +void var::set_function(abstract_syntax_tree p) { function=p; return; @@ -193,7 +193,7 @@ var* var::get_hash_member_addr(std::string _name) return &error_var; } -abstract_syntax_tree& var::get_function() +abstract_syntax_tree var::get_function() { return function; } diff --git a/balloon/lib/math.nas b/balloon/lib/math.nas index 0013f20..187ac88 100644 --- a/balloon/lib/math.nas +++ b/balloon/lib/math.nas @@ -55,7 +55,7 @@ var cosh=func(__x) var tanh=func(__x) { __x=exp(__x); - return 1-2/(x*x+1); + return 1-2/(__x*__x+1); }; var relu=func(__x) diff --git a/balloon/main.cpp b/balloon/main.cpp index 9910c39..cee21b8 100644 --- a/balloon/main.cpp +++ b/balloon/main.cpp @@ -26,6 +26,7 @@ int main() std::cout<<">> 8. [run ] |run the programme in stack. (-lexer -parser)"<> 9. [rs ] |check the source program."<>10. [lib ] |add lib into resource codes."<>11. [sound ] |make noise(?)."<>[Lexer] error(s) found,stop."<