From 2989f731e72cb79dc3c015c7386ba528cc9c5c39 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Mon, 11 Nov 2019 23:31:20 +0800 Subject: [PATCH] Add continue|break|return --- balloon/abstract_syntax_tree.cpp | 104 +++++++++++++++++++++++-------- balloon/abstract_syntax_tree.h | 4 +- balloon/balloon_parse.h | 15 +++-- 3 files changed, 88 insertions(+), 35 deletions(-) diff --git a/balloon/abstract_syntax_tree.cpp b/balloon/abstract_syntax_tree.cpp index 94e196e..f3962a0 100644 --- a/balloon/abstract_syntax_tree.cpp +++ b/balloon/abstract_syntax_tree.cpp @@ -5,7 +5,39 @@ int exit_type=0; bool abstract_syntax_tree::check() { - + bool ret=false; + if(this->type==__cmp_equal) + { + + } + else if(this->type==__cmp_not_equal) + { + + } + else if(this->type==__cmp_less) + { + + } + else if(this->type==__cmp_less_or_equal) + { + + } + else if(this->type==__cmp_more) + { + + } + else if(this->type==__cmp_more_or_equal) + { + + } + else if(this->type==__or_operator) + { + + } + else if(this->type==__and_operator) + { + + } return true; } @@ -123,24 +155,42 @@ void abstract_syntax_tree::run_root() return; } -void abstract_syntax_tree::run_loop() +int abstract_syntax_tree::run_loop() { + int ret=0; scope.add_new_local_scope(); abstract_syntax_tree condition=children.front(); abstract_syntax_tree blk=children.back(); while(condition.check()) - blk.run_block(); + { + int type=blk.run_block(); + if(type==__break) + break; + else if(type==__return) + { + ret=__return; + break; + } + } scope.pop_last_local_scope(); - return; + return ret; } -void abstract_syntax_tree::run_ifelse() +int abstract_syntax_tree::run_ifelse() { + int ret=0; scope.add_new_local_scope(); - + for(std::list::iterator i=children.begin();i!=children.end();++i) + { + if(i->children.front().check()) + { + ret=i->children.back().run_block(); + break; + } + } scope.pop_last_local_scope(); - return; + return ret; } void abstract_syntax_tree::run_func() @@ -184,31 +234,31 @@ int abstract_syntax_tree::run_block() else if(i->type==__id) std::cout<call_id().get_name()<type==__while) - i->run_loop(); + { + int type=i->run_loop(); + if(type) + { + if(type==__return) + return type; + else + { + std::cout<<"[Runtime-error] incorrect use of break/continue."<type==__ifelse) - i->run_ifelse(); + { + int type=i->run_ifelse(); + if(type) + return type; + } else if(i->type==__continue) - { return __continue; -// else -// { -// std::cout<<">>[Runtime-error] must use \'continue\' in a loop."<type==__break) - { - return __loop; -// else -// { -// std::cout<<">>[Runtime-error] must use \'continue\' in a loop."<type==__return) - { - break; - } + return __return; if(exit_type!=__process_exited_successfully) break; } diff --git a/balloon/abstract_syntax_tree.h b/balloon/abstract_syntax_tree.h index a60f303..09846cb 100644 --- a/balloon/abstract_syntax_tree.h +++ b/balloon/abstract_syntax_tree.h @@ -188,8 +188,8 @@ class abstract_syntax_tree var call_id(); var get_value(); void run_root(); - void run_loop(); - void run_ifelse(); + int run_loop(); + int run_ifelse(); void run_func(); int run_block(); }; diff --git a/balloon/balloon_parse.h b/balloon/balloon_parse.h index 4ad3dd8..3bb762c 100644 --- a/balloon/balloon_parse.h +++ b/balloon/balloon_parse.h @@ -315,10 +315,7 @@ abstract_syntax_tree balloon_parse::array_generate() std::cout<<">>[Parse-error] line "<>[Parse-error] line "<>[Parse-error] line "<