diff options
-rw-r--r-- | bashast/libbashWalker.g | 24 | ||||
-rw-r--r-- | scripts/compound_command.bash | 79 | ||||
-rw-r--r-- | scripts/compound_command.bash.result | 9 |
3 files changed, 107 insertions, 5 deletions
diff --git a/bashast/libbashWalker.g b/bashast/libbashWalker.g index 02e2f33..2bd446d 100644 --- a/bashast/libbashWalker.g +++ b/bashast/libbashWalker.g @@ -719,6 +719,12 @@ for_expr { e.rethrow_unless_correct_frame(); } + catch(break_exception& e) + { + e.rethrow_unless_correct_frame(); + SEEK(commands_index); + break; + } SEEK(commands_index); } seek_to_next_tree(ctx); @@ -743,8 +749,10 @@ for_expr SEEK(condition_index); + ANTLR3_MARKER command_index; while(!has_condition || for_condition(ctx)) { + command_index = INDEX(); try { command_list(ctx); @@ -758,10 +766,15 @@ for_expr SEEK(modification_index); for_modification(ctx); } - SEEK(condition_index); continue; } + catch(break_exception& e) + { + e.rethrow_unless_correct_frame(); + SEEK(command_index); + break; + } if(has_modification) for_modification(ctx); SEEK(condition_index); @@ -789,6 +802,7 @@ for_modification while_expr @declarations { ANTLR3_MARKER condition_index; + ANTLR3_MARKER command_index; bool negate; } :^((WHILE { negate = false; } | UNTIL { negate = true; }) { @@ -801,6 +815,8 @@ while_expr command_list(ctx); if(walker->get_status() == (negate? 0 : 1)) break; + + command_index = INDEX(); try { command_list(ctx); @@ -811,6 +827,12 @@ while_expr SEEK(condition_index); continue; } + catch(break_exception& e) + { + e.rethrow_unless_correct_frame(); + SEEK(command_index); + break; + } SEEK(condition_index); } // Skip the body and get out diff --git a/scripts/compound_command.bash b/scripts/compound_command.bash index 06b4f9e..ece5504 100644 --- a/scripts/compound_command.bash +++ b/scripts/compound_command.bash @@ -46,6 +46,22 @@ do echo $file done +for file in foo bar +do + if [[ $file == "foo" ]]; then + break + fi + echo $file +done + +for file in foo bar +do + if [[ $file == "bar" ]]; then + break + fi + echo $file +done + for outer in 1 2 3 do for file in foo bar @@ -57,6 +73,17 @@ do done done +for outer in 1 2 3 +do + for file in foo bar + do + if [[ $file == "foo" && $outer == 1 ]]; then + break 2 + fi + echo "$outer $file" + done +done + i=0; while [ $i != 4 ] do @@ -80,6 +107,16 @@ do done i=0 +while [ $i != 4 ] +do + i=$(( i + 1 )) + if [[ $i == 1 ]]; then + break + fi + echo $i +done + +i=0 j=1 while [ $i != 4 ] do @@ -95,6 +132,22 @@ do done done +i=0 +j=1 +while [ $i != 4 ] +do + i=$(( i + 1 )) + + while [ $j == 1 ] + do + if [[ $i == 1 ]]; then + break 2 + fi + echo $i + let ++j + done +done + i=0; until [ $i == 4 ] do @@ -118,6 +171,16 @@ do done i=0 +until [ $i == 4 ] +do + i=$(( i + 1 )) + if [[ $i == 1 ]]; then + break + fi + echo $i +done + +i=0 j=1 until [ $i == 4 ] do @@ -133,6 +196,22 @@ do done done +i=0 +j=1 +until [ $i == 4 ] +do + i=$(( i + 1 )) + + while [ $j == 1 ] + do + if [[ $i == 1 ]]; then + break 2 + fi + echo $i + let ++j + done +done + a=1 b=2 if [ $a == $b ] diff --git a/scripts/compound_command.bash.result b/scripts/compound_command.bash.result index 4662025..c083e6a 100644 --- a/scripts/compound_command.bash.result +++ b/scripts/compound_command.bash.result @@ -13,6 +13,7 @@ ghi 10 bar foo +foo 2 foo 2 bar 3 foo @@ -52,9 +53,9 @@ case end a=1 b=2 bar= -file=bar +file=foo foo=ghi -i=4 -j=2 -outer=3 +i=1 +j=1 +outer=1 target=_ |