From 293370e6a876122c14da688c54b4e1c1dd195d67 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Mon, 7 Sep 2020 02:02:50 -0700 Subject: [PATCH] update --- version3.0/main.cpp | 3 +- version3.0/nasal_runtime.h | 104 ++++++++++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/version3.0/main.cpp b/version3.0/main.cpp index fd167eb..84ce37b 100644 --- a/version3.0/main.cpp +++ b/version3.0/main.cpp @@ -10,6 +10,7 @@ void help() { std::cout<<">> [\'file\'] input a file."<> [cls ] clear the screen."<> [clear ] clear the screen."<> [del ] clear the resource code."<> [lib ] add lib file."<> [rs ] print resource code."<>command; if(command=="help") help(); - else if(command=="cls") + else if(command=="cls" || command=="clear") { #ifdef _WIN32 system("cls"); diff --git a/version3.0/nasal_runtime.h b/version3.0/nasal_runtime.h index 057354b..e926b85 100644 --- a/version3.0/nasal_runtime.h +++ b/version3.0/nasal_runtime.h @@ -44,6 +44,7 @@ private: // run loop int loop_progress(nasal_ast&,int,bool); // run conditional + bool check_condition(int); int conditional_progress(nasal_ast&,int,bool); // get scalars in complex data structure like vector/hash/function/closure(scope) int call_scalar(nasal_ast&,int); @@ -268,6 +269,7 @@ int nasal_runtime::main_progress() int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allow_return) { int ret_state=rt_exit_without_error; + // if local_scope does not exist,create a new one. if(local_scope_addr<0) { local_scope_addr=nasal_vm.gc_alloc(); @@ -349,13 +351,111 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allo int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow_return) { int ret_state=rt_exit_without_error; - // unfinished + int loop_type=node.get_type(); + if(loop_type==ast_while) + { + nasal_ast& condition_node=node.get_children()[0]; + nasal_ast& run_block_node=node.get_children()[1]; + + int condition_value_addr=calculation(condition_node,local_scope_addr); + if(condition_value_addr<0) + return rt_error; + while(check_condition(condition_value_addr)) + { + // return expression will be checked in block_progress + ret_state=block_progress(run_block_node,local_scope_addr,allow_return); + if(ret_state==rt_break || ret_state==rt_error || ret_state==rt_return) + break; + condition_value_addr=calculation(condition_node,local_scope_addr); + if(condition_value_addr<0) + return rt_error; + } + if(ret_state==rt_continue || ret_state==rt_break) + ret_state=rt_exit_without_error; + } + else if(loop_type==ast_forindex || loop_type==ast_foreach) + { + nasal_ast& iter_node=node.get_children()[0]; + nasal_ast& vector_node=node.get_children()[1]; + nasal_ast& run_block_node=node.get_children()[2]; + int vector_value_addr=calculation(vector_node,local_scope_addr); + if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) + { + std::cout<<">> [runtime] loop_progress: "<<(loop_type==ast_forindex? "forindex":"foreach")<<" gets a value that is not a vector."<> [runtime] check_condition: error value type when checking condition."<> [runtime] check_condition: error value type, \'"<