From 3aae6494ce44a5652d4d9e687d1374043cfbafce Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Wed, 27 Nov 2019 16:01:11 +0800 Subject: [PATCH] Add new functions --- balloon/abstract_syntax_tree.cpp | 40 ++++++++++++++++++++++++++++++++ balloon/balloon_var.h | 8 +++++++ balloon/lib/basics.nas | 13 +++++++++++ balloon/lib/math.nas | 1 + 4 files changed, 62 insertions(+) diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index af2e963..53d3aa6 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -694,8 +694,11 @@ void abstract_syntax_tree::run_root() { recursion_depth=0; ++recursion_depth; + + // before running initializing while(!ret_stack.empty())ret_stack.pop(); scope.set_clear(); + srand(unsigned(time(NULL))); int beg_time,end_time; exit_type=__process_exited_successfully; @@ -1057,6 +1060,43 @@ var abstract_syntax_tree::run_func(std::list parameter,var self_func) ret.set_string(str_for_input); ret_stack.push(ret); } + else if(self_func.get_name()=="size") + { + if(!parameter.empty()) + { + std::list::iterator i=parameter.begin(); + if(i->get_type()==__var_array) + { + int cnt=0; + cnt=i->get_array_size(); + ret.set_type(__var_number); + ret.set_number((double)cnt); + } + else + { + exit_type=__error_value_type; + std::cout<<">>[Runtime-error] line "<line<<": incorrect value type.must use an array."<>[Runtime-error] line "<line<<": lack parameter(s)."<=1)content/=10; + ret.set_number(content); + // this must be added when running a function + ret_stack.push(ret); + } else { for(;para_name!=para.children.end();++para_name,++para_value) diff --git a/balloon/balloon_var.h b/balloon/balloon_var.h index b91044f..fbc237c 100644 --- a/balloon/balloon_var.h +++ b/balloon/balloon_var.h @@ -71,6 +71,7 @@ class var var get_hash_member(std::string); var* get_hash_member_addr(std::string); abstract_syntax_tree get_function(); + int get_array_size(); }; var error_var; @@ -197,4 +198,11 @@ abstract_syntax_tree var::get_function() { return function; } + +int var::get_array_size() +{ + int cnt=0; + for(std::list::iterator i=balloon_array.begin();i!=balloon_array.end();++i)++cnt; + return cnt; +} #endif diff --git a/balloon/lib/basics.nas b/balloon/lib/basics.nas index da2744d..13686ca 100644 --- a/balloon/lib/basics.nas +++ b/balloon/lib/basics.nas @@ -33,4 +33,17 @@ var int=func(value) var num=func(value) { return __call_Cpp_type_trans_num(value); +}; + +# size function is used to count the number of members in an array +var size=func(value) +{ + return __call_Cpp_value_count(value); +}; + +# rand function is used to make random float numbers between 0 and 1 ([0,1)) +# written by C: srand(unsigned(time(NULL))) rand() +var rand=func() +{ + return __call_Cpp_rand(); }; \ No newline at end of file diff --git a/balloon/lib/math.nas b/balloon/lib/math.nas index 2dbb838..7f2c3b6 100644 --- a/balloon/lib/math.nas +++ b/balloon/lib/math.nas @@ -67,6 +67,7 @@ var tanh=func(__x) return 1-2/(__x*__x+1); }; +# relu function is a normal function used in deep neural networks var relu=func(__x) { if(x>=0){return __x;}