From b701637db62c2a21e71722c5bfc72e419ab27fc6 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sun, 2 Aug 2020 01:01:48 -0700 Subject: [PATCH] update --- version3.0/main.cpp | 24 ++++++++++-- version3.0/nasal_gc.h | 10 ++--- version3.0/nasal_runtime.h | 78 ++++++++++++++++++++++++++++---------- 3 files changed, 84 insertions(+), 28 deletions(-) diff --git a/version3.0/main.cpp b/version3.0/main.cpp index 1186cfb..1aec524 100644 --- a/version3.0/main.cpp +++ b/version3.0/main.cpp @@ -4,6 +4,7 @@ nasal_resource resource; nasal_lexer lexer; nasal_parse parse; std::string command; +nasal_runtime runtime; void help() { @@ -81,6 +82,25 @@ void ast_func() std::cout<<">> [lexer] error(s) occurred,stop.\n"; return; } +void runtime_start() +{ + lexer.scanner(resource.get_file()); + if(!lexer.get_error()) + { + parse.set_toklist(lexer.get_token_list()); + parse.main_process(); + if(parse.get_error()) + std::cout<<">> [parse] error(s) occurred,stop.\n"; + else + { + runtime.set_root(parse.get_root()); + runtime.run(); + } + } + else + std::cout<<">> [lexer] error(s) occurred,stop.\n"; + return; +} int main() { @@ -135,9 +155,7 @@ int main() else if(command=="ast") ast_func(); else if(command=="run") - { - ; - } + runtime_start(); else if(command=="logo") logo(); else if(command=="exit") diff --git a/version3.0/nasal_gc.h b/version3.0/nasal_gc.h index 44851ec..bff552c 100644 --- a/version3.0/nasal_gc.h +++ b/version3.0/nasal_gc.h @@ -29,8 +29,8 @@ public: class nasal_function { private: - // this int points to the space in nasal_vm::memory_manager_memory - std::list closures; + // this int points to the space in nasal_vm::garbage_collector_memory + int closure_addr; nasal_ast function_tree; public: nasal_function(); @@ -180,15 +180,13 @@ void nasal_hash::del_elem(std::string key) /*functions of nasal_function*/ nasal_function::nasal_function() { - closures.clear(); + closure_addr=-1; function_tree.clear(); return; } nasal_function::~nasal_function() { - for(std::list::iterator iter=closures.begin();iter!=closures.end();++iter) - nasal_vm.mem_free(*iter); - closures.clear(); + nasal_vm.del_reference(closure_addr); function_tree.clear(); return; } diff --git a/version3.0/nasal_runtime.h b/version3.0/nasal_runtime.h index df4dd27..2187af8 100644 --- a/version3.0/nasal_runtime.h +++ b/version3.0/nasal_runtime.h @@ -1,46 +1,56 @@ #ifndef __NASAL_RUNTIME_H__ #define __NASAL_RUNTIME_H__ +enum runtime_returned_state +{ + rt_return=1, + rt_break, + rt_continue, + rt_error, + rt_exit_without_error +}; + class nasal_runtime { private: - // global_scope_address is address in garbage_collector_memory,NOT memory_manager_memory + // global_scope_address and function_return_address are addresses in garbage_collector_memory + int function_returned_address; int global_scope_address; nasal_ast root; - std::stack function_position; - std::stack running_stack; - std::stack closure_stack; + // process functions are private + int main_progress(); + int block_progress(); + int loop_progress(); + int conditional_progress(); + int function_progress(); + int calculation(); public: nasal_runtime(); ~nasal_runtime(); + void set_root(nasal_ast&); void run(); }; nasal_runtime::nasal_runtime() { - root.clear(); - while(!function_position.empty()) - function_position.pop(); - while(!running_stack.empty()) - running_stack.pop(); - while(!closure_stack.empty()) - closure_stack.pop(); + this->root.clear(); + this->global_scope_address=-1; return; } nasal_runtime::~nasal_runtime() { - root.clear(); - while(!function_position.empty()) - function_position.pop(); - while(!running_stack.empty()) - running_stack.pop(); - while(!closure_stack.empty()) - closure_stack.pop(); + this->root.clear(); + this->global_scope_address=-1; + return; +} +void nasal_runtime::set_root(nasal_ast& parse_result) +{ + this->root=parse_result; return; } void nasal_runtime::run() { - global_scope_address=nasal_vm.gc_alloc(); + this->global_scope_address=nasal_vm.gc_alloc(); nasal_vm.gc_get(global_scope_address).set_type(vm_closure); nasal_vm.gc_get(global_scope_address).get_closure().add_scope(); @@ -48,5 +58,35 @@ void nasal_runtime::run() nasal_vm.del_reference(global_scope_address); return; } +int nasal_runtime::main_progress() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} +int nasal_runtime::block_progress() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} +int nasal_runtime::loop_progress() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} +int nasal_runtime::conditional_progress() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} +int nasal_runtime::function_progress() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} +int nasal_runtime::calculation() +{ + int ret_state=rt_exit_without_error; + return ret_state; +} #endif \ No newline at end of file