[svn:parrot] r44706 - branches/ops_pct/compilers/opsc/src/Ops/Compiler
cotto at svn.parrot.org
cotto at svn.parrot.org
Sat Mar 6 18:26:46 UTC 2010
Author: cotto
Date: Sat Mar 6 18:26:44 2010
New Revision: 44706
URL: https://trac.parrot.org/parrot/changeset/44706
Log:
[opsc] fix op macro substitutions, break op_body action into two parts to allow munch_body access to the past
Modified:
branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm
Modified: branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm Sat Mar 6 14:20:31 2010 (r44705)
+++ branches/ops_pct/compilers/opsc/src/Ops/Compiler/Actions.pm Sat Mar 6 18:26:44 2010 (r44706)
@@ -214,14 +214,15 @@
method op_body($/) {
# Single big chunk
- make PAST::Op.new(
+ my $op := PAST::Op.new(
:node($/),
:pasttype('inline'),
- :inline(munch_body(~$/))
);
+ $op<inline> := munch_body($op, ~$/);
+ make $op;
}
-sub munch_body($body) {
+sub munch_body($op, $body) {
#
# Macro substitutions:
#
@@ -252,40 +253,82 @@
# with labels, etc.).
#
- #subst($body, /\b/, { eval('{{$0}}') } );
+ #'goto ADDRESS((foo))' -> '{{=foo}}'
$body := subst($body,
/goto \s+ ADDRESS '((' $<addr>=[.*?] '))'/,
-> $m { '{{=' ~ $m<addr> ~ '}}' }
);
+
+ #'expr ADDRESS((foo))' -> '{{^foo}}'
$body := subst($body,
/expr \s+ ADDRESS '((' $<addr>=[.*?] '))'/,
-> $m { '{{^' ~ $m<addr> ~ '}}' }
);
+
+
+ #'goto ADDRESS(foo)' -> '{{=foo}}'
$body := subst($body,
/goto \s+ ADDRESS '(' $<addr>=[.*?] ')'/,
-> $m { '{{=' ~ $m<addr> ~ '}}' }
);
+
+ #'expr ADDRESS(foo)' -> '{{^=foo}}'
$body := subst($body,
/expr \s+ ADDRESS '(' $<addr>=[.*?] ')'/,
-> $m { '{{^' ~ $m<addr> ~ '}}' }
);
+ #'goto OFFSET((foo))' -> '{{+=foo}}'
+ $body := subst($body,
+ /goto \s+ OFFSET '((' $<addr>=[.*?] '))'/,
+ -> $m { '{{+=' ~ $m<addr> ~ '}}' }
+ );
+
+
+ #'goto OFFSET(foo)' -> '{{+=foo}}'
+ $body := subst($body,
+ /goto \s+ OFFSET '(' $<addr>=[.*?] ')'/,
+ -> $m { '{{+=' ~ $m<addr> ~ '}}' }
+ );
+
+ #'expr OFFSET((foo))' -> '{{^=foo}}'
+ $body := subst($body,
+ /expr \s+ OFFSET '((' $<addr>=[.*?] '))'/,
+ -> $m { '{{^=' ~ $m<addr> ~ '}}' }
+ );
+
+
+ #'expr OFFSET(foo)' -> '{{+=foo}}'
+ $body := subst($body,
+ /expr \s+ OFFSET '(' $<addr>=[.*?] ')'/,
+ -> $m { '{{^=' ~ $m<addr> ~ '}}' }
+ );
+
+ #'expr NEXT()' -> '{{^+OP_SIZE}}'
$body := subst($body, /expr \s+ NEXT '(' ')'/, '{{^+OP_SIZE}}');
+ #'goto NEXT()' -> '{{+=OP_SIZE}}'
$body := subst($body, /goto \s+ NEXT '(' ')'/, '{{+=OP_SIZE}}');
+
+ #'restart OFFSET(foo)' -> '{{=0,+=foo}}'
$body := subst($body,
/restart \s+ OFFSET '(' $<addr>=[.*?] ')'/,
- -> $m { '{{=0,+' ~ $m<addr> ~ '}}' }
+ -> $m { '{{=0,+=' ~ $m<addr> ~ '}}' }
);
+
+ #'restart NEXT()' -> '{{=0,+=OP_SIZE}}'
$body := subst($body,
/restart \s+ NEXT '(' ')'/,
'{{=0,+=OP_SIZE}}'
);
+
+ #'restart ADDRESS(foo)' -> '{{=foo}}'
$body := subst($body,
/restart \s+ ADDRESS '(' $<addr>=[.*?] ')'/,
-> $m { '{{=' ~ $m<addr> ~ '}}' }
);
+ #'$1' -> '{{@1}}'
$body := subst($body,
/'$' $<arg_num>=[\d+]/,
-> $m { '{{@' ~ $m<arg_num> ~ '}}' }
More information about the parrot-commits
mailing list