Author: duff
Date: Tue Apr  1 23:28:50 2008
New Revision: 26701

Modified:
   trunk/languages/perl6/src/parser/actions.pm
   trunk/languages/perl6/src/parser/grammar.pg

Log:
[rakudo] Add loop statement


Modified: trunk/languages/perl6/src/parser/actions.pm
==============================================================================
--- trunk/languages/perl6/src/parser/actions.pm (original)
+++ trunk/languages/perl6/src/parser/actions.pm Tue Apr  1 23:28:50 2008
@@ -219,6 +219,28 @@
     make $past;
 }
 
+method loop_statement($/) {
+    if $<eee> {
+        my $init := $( $<e1>[0] );
+        my $cond := $( $<e2>[0] );
+        my $tail := $( $<e3>[0] );
+        my $block := $( $<block> );
+        $block.blocktype('immediate');
+
+        my $loop := PAST::Stmts.new(
+            $init,
+            PAST::Op.new( $cond , PAST::Stmts.new($block, $tail), 
:pasttype('while'), :node($/) ),
+            :node($/)
+        );
+        make $loop;
+    } else {
+        my $cond  := PAST::Val.new( :value( 1 ) );
+        my $block := $( $<block> );
+        $block.blocktype('immediate');
+        make PAST::Op.new( $cond, $block, :pasttype('while'), :node($/) );
+    }
+}
+
 method for_statement($/) {
     my $block := $( $<pblock> );
     $block.blocktype('declaration');

Modified: trunk/languages/perl6/src/parser/grammar.pg
==============================================================================
--- trunk/languages/perl6/src/parser/grammar.pg (original)
+++ trunk/languages/perl6/src/parser/grammar.pg Tue Apr  1 23:28:50 2008
@@ -209,6 +209,7 @@
     | <given_statement> {*}                      #= given_statement
     | <when_statement> {*}                       #= when_statement
     | <default_statement> {*}                    #= default_statement
+    | <loop_statement> {*}                       #= loop_statement
     | <for_statement> {*}                        #= for_statement
     | <use_statement> {*}                        #= use_statement
     | <begin_statement> {*}                      #= begin_statement
@@ -261,6 +262,19 @@
     {*}
 }
 
+rule loop_statement {
+    $<sym>=[loop]
+    $<eee>=[
+        '('
+            $<e1>=<EXPR> ';'
+            $<e2>=<EXPR> ';'
+            $<e3>=<EXPR>
+        ')'
+    ]?
+    <block>
+    {*}
+}
+
 rule for_statement {
     $<sym>=[for]
     <EXPR> <pblock>

Reply via email to