# New Ticket Created by "Daniel Keane" # Please include the string: [perl #61620] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=61620 >
A small patch to add do-while functionality to pipp. Files changed: * t/php/control_flow.t - add 2 tests for do-while statement * src/pct/actions.pm - add action method 'do_while_statement' * src/pct/grammer.pg - add rule 'do_while_statement' * CREDITS - add email address and above patch Thanks
Index: t/php/control_flow.t =================================================================== --- t/php/control_flow.t (revision 34246) +++ t/php/control_flow.t (working copy) @@ -24,7 +24,7 @@ use Parrot::Config (); use Parrot::Test; -use Test::More tests => 16; +use Test::More tests => 18; language_output_is( 'Pipp', <<'CODE', <<'OUT', 'if, one statement in block' ); <?php @@ -219,6 +219,43 @@ round 10 OUT +language_output_is('Pipp', <<'CODE', <<'OUT', 'do-while loop'); +<?php + +$count = 0; +do { echo "round $count\n"; $count++; } while ($count <= 10); +CODE +round 0 +round 1 +round 2 +round 3 +round 4 +round 5 +round 6 +round 7 +round 8 +round 9 +round 10 +OUT + +language_output_is( 'Pipp', <<'CODE', <<'OUT', 'do-while with negated expression'); +<?php + +$count = 0; +do { $count++; echo "round $count\n"; } while (!($count >= 10)); +CODE +round 1 +round 2 +round 3 +round 4 +round 5 +round 6 +round 7 +round 8 +round 9 +round 10 +OUT + language_output_is( 'Pipp', <<'CODE', <<'OUT', 'classic for-loop' ); <?php Index: src/pct/actions.pm =================================================================== --- src/pct/actions.pm (revision 34246) +++ src/pct/actions.pm (working copy) @@ -234,13 +234,23 @@ method conditional_expression($/) { my $past := PAST::Op.new( - $( $<expression> ), - $( $<block> ), + $($<expression>), + $($<block>), :node($/) ); make $past; } +method do_while_statement($/) { + my $past := PAST::Op.new( + $($<expression>), + $($<block>), + :pasttype('repeat_while'), + :node($/) + ); + make $past; +} + method if_statement($/) { my $past := $($<conditional_expression>); $past.pasttype('if'); @@ -277,13 +287,13 @@ } method else_clause($/) { - make $($<block>); + make $($<block>); } method elseif_clause($/) { - my $past := $($<conditional_expression>); - $past.pasttype('if'); - make $past; + my $past := $($<conditional_expression>); + $past.pasttype('if'); + make $past; } method var_assign($/) { make PAST::Op.new( Index: src/pct/grammar.pg =================================================================== --- src/pct/grammar.pg (revision 34246) +++ src/pct/grammar.pg (working copy) @@ -126,6 +126,7 @@ | <expression_statement> {*} #= expression_statement | <if_statement> {*} #= if_statement | <while_statement> {*} #= while_statement + | <do_while_statement> {*} #= do_while_statement | <for_statement> {*} #= for_statement | <inline_sea_short_tag> {*} #= inline_sea_short_tag | <inline_sea_script_tag> {*} #= inline_sea_script_tag @@ -198,6 +199,11 @@ {*} } +rule do_while_statement { + 'do' <block> 'while' '(' <expression> ')' <.statement_delimiter> + {*} +} + rule for_statement { 'for' '(' <var_assign> <expression> ';' <expression> ')' <block> {*} Index: CREDITS =================================================================== --- CREDITS (revision 34246) +++ CREDITS (working copy) @@ -26,4 +26,6 @@ D: Code beautification N: Daniel Keane +E: keane...@gmail.com D: Implementation of 'elsif' +D: Implementation of 'do-while'