Author: tene
Date: Tue Dec 16 14:27:48 2008
New Revision: 33989
Modified:
trunk/languages/perl6/src/parser/actions.pm
trunk/languages/perl6/src/parser/grammar.pg
Log:
[rakudo]: CONTROL blocks
Modified: trunk/languages/perl6/src/parser/actions.pm
==============================================================================
--- trunk/languages/perl6/src/parser/actions.pm (original)
+++ trunk/languages/perl6/src/parser/actions.pm Tue Dec 16 14:27:48 2008
@@ -447,6 +447,11 @@
PAST::Var.new( :name('$_'), :scope('lexical') ),
PAST::Var.new( :name('exception'), :scope('register') )
),
+ PAST::Op.new(
+ :pasttype('bind'),
+ PAST::Var.new( :name('$!'), :scope('lexical') ),
+ PAST::Var.new( :name('exception'), :scope('register') )
+ ),
$past
);
our $?BLOCK;
@@ -460,6 +465,36 @@
make PAST::Stmts.new();
}
+method control_statement($/) {
+ my $past := $( $<block> );
+ $past.blocktype('immediate');
+ $past := PAST::Stmts.new(
+ PAST::Op.new(
+ :pasttype('bind'),
+ PAST::Var.new( :name('$_'), :scope('lexical') ),
+ PAST::Var.new( :name('exception'), :scope('register') )
+ ),
+ PAST::Op.new(
+ :pasttype('bind'),
+ PAST::Var.new( :name('$!'), :scope('lexical') ),
+ PAST::Var.new( :name('exception'), :scope('register') )
+ ),
+ $past
+ );
+ our $?BLOCK;
+ my $eh := PAST::Control.new(
+ $past,
+ :handle_types('CONTROL')
+ );
+ my @handlers;
+ if $?BLOCK.handlers() {
+ @handlers := $?BLOCK.handlers();
+ }
+ @handlers.unshift($eh);
+ $?BLOCK.handlers(@handlers);
+ make PAST::Stmts.new();
+}
+
method statement_mod_loop($/) {
my $expr := $( $<EXPR> );
my $sym := ~$<sym>;
Modified: trunk/languages/perl6/src/parser/grammar.pg
==============================================================================
--- trunk/languages/perl6/src/parser/grammar.pg (original)
+++ trunk/languages/perl6/src/parser/grammar.pg Tue Dec 16 14:27:48 2008
@@ -243,6 +243,7 @@
| <begin_statement> {*} #= begin_statement
| <end_statement> {*} #= end_statement
| <catch_statement> {*} #= catch_statement
+ | <control_statement> {*} #= control_statement
}
rule if_statement {
@@ -332,6 +333,12 @@
{*}
}
+rule control_statement {
+ $<sym>=[CONTROL]
+ <block>
+ {*}
+}
+
rule statement_mod_loop {
$<sym>=[while|until|for|given] <EXPR> {*}
}