Author: pmichaud
Date: Mon Nov 10 00:12:12 2008
New Revision: 32484
Modified:
trunk/languages/perl6/src/parser/actions.pm
trunk/languages/perl6/src/parser/grammar.pg
Log:
[rakudo]: Refactor statement modifiers
Modified: trunk/languages/perl6/src/parser/actions.pm
==============================================================================
--- trunk/languages/perl6/src/parser/actions.pm (original)
+++ trunk/languages/perl6/src/parser/actions.pm Mon Nov 10 00:12:12 2008
@@ -103,52 +103,36 @@
method statement($/, $key) {
my $past;
- if $key eq 'statement_control' {
+ if $key eq 'control' {
$past := $( $<statement_control> );
}
elsif $key eq 'null' {
$past := PAST::Stmts.new(); # empty stmts seem eliminated by TGE
}
else {
- my $expr := $( $<expr> );
- if $expr.isa(PAST::Block) && !$expr.blocktype() {
- $expr.blocktype('immediate');
+ my $sml;
+ $past := $( $<expr> );
+ if $past.isa(PAST::Block) && !$past.blocktype() {
+ $past.blocktype('immediate');
}
-
- if $key eq 'statement_mod_cond' {
+ if $key eq 'mod_cond' {
+ my $body := $past;
$past := $( $<statement_mod_cond> );
- $past.push( $expr );
- if $<sml> {
- $expr := $past;
- $key := 'statement_mod_loop';
- $<statement_mod_loop> := $<sml>[0];
- }
+ $past.push( $body );
+ $sml := $<statement_mod_loop>[0];
}
- elsif $key eq 'statement_mod_loop' {
- my $mod := $( $<statement_mod_loop> );
- if $<statement_mod_loop><sym> eq 'for' {
- my $loop := PAST::Block.new(
- PAST::Stmts.new(
- PAST::Var.new(
- :name('$_'),
- :scope('parameter'),
- :viviself('Failure')
- ),
- $expr
- ),
- :node( $/ )
- );
- $loop.symbol( '$_', :scope('lexical') );
- $mod.push($loop);
- $past := PAST::Stmts.new( $mod, :node($/) );
- }
- else {
- $mod.push( $expr );
- $past := PAST::Block.new( $mod, :blocktype('immediate'),
:node($/) );
+ if $key eq 'mod_loop' { $sml := $<statement_mod_loop>; }
+ if $sml {
+ my $body := $past;
+ if $sml<sym> eq 'for' {
+ if !$body.isa(PAST::Block) {
+ $body := PAST::Block.new( PAST::Stmts.new(), $body );
+ $body.blocktype('immediate');
+ }
+ declare_implicit_function_vars( $body );
}
- }
- else {
- $past := $expr;
+ $past := $( $sml );
+ $past.push( $body );
}
}
make $past;
@@ -374,32 +358,18 @@
method statement_mod_cond($/) {
my $sym := ~$<sym>;
+ my $expr := $( $<EXPR> );
if $sym eq 'when' {
- my $expr := $( $<EXPR> );
- my $match_past := PAST::Op.new(
- :name('infix:~~'),
- :pasttype('call'),
- :node($/)
- );
- $match_past.push(
- PAST::Var.new( :node($/), :name('$_'), :scope('lexical') )
- );
- $match_past.push( $expr );
-
- my $past := PAST::Op.new(
- $match_past,
- :pasttype('if'),
- :node( $/ )
- );
- make $past;
- }
- else {
- make PAST::Op.new(
- $( $<EXPR> ),
- :pasttype( $sym ),
- :node( $/ )
- );
+ $expr := PAST::Op.new(
+ PAST::Var.new( :name('$_'), :scope('lexical') ),
+ $expr,
+ :name('infix:~~'),
+ :pasttype('call'),
+ :node($/)
+ );
+ $sym := 'if';
}
+ make PAST::Op.new( $expr, :pasttype($sym), :node($/) );
}
Modified: trunk/languages/perl6/src/parser/grammar.pg
==============================================================================
--- trunk/languages/perl6/src/parser/grammar.pg (original)
+++ trunk/languages/perl6/src/parser/grammar.pg Mon Nov 10 00:12:12 2008
@@ -215,15 +215,13 @@
## or an expression. Any statement termination is handled by
## the calling rule.
rule statement {
- | <statement_control> {*} #= statement_control
+ | <statement_control> {*} #= control
| <expr=EXPR>
[
- || <statement_mod_loop> {*} #= statement_mod_loop
+ || <statement_mod_loop> {*} #= mod_loop
|| <statement_mod_cond>
- [
- <sml=statement_mod_loop>
- ]?
- {*} #= statement_mod_cond
+ <statement_mod_loop>?
+ {*} #= mod_cond
|| {*} #= expr
]
| <?before ';'> {*} #= null