Author: tene
Date: Thu Aug 14 06:50:33 2008
New Revision: 30227

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

Log:
[cardinal]
* Allow assignment of do blocks to variables
* Factor out signaure handling of both function definitions and do blocks


Modified: trunk/languages/cardinal/src/parser/actions.pm
==============================================================================
--- trunk/languages/cardinal/src/parser/actions.pm      (original)
+++ trunk/languages/cardinal/src/parser/actions.pm      Thu Aug 14 06:50:33 2008
@@ -499,7 +499,7 @@
 method functiondef($/) {
     my $past := $( $<comp_stmt> );
     my $name := $<fname>;
-    my $arity := $past[0]<arity>;
+    my $arity := +$past[0]<arity>;
     #my $args := $( $<argdecl> );
     #$past.push($args);
     $past.name(~$name);
@@ -512,7 +512,7 @@
     make $past;
 }
 
-method argdecl($/) {
+method block_signature($/) {
     my $params := PAST::Stmts.new( :node($/) );
     my $past := PAST::Block.new($params, :blocktype('declaration'));
     for $<identifier> {
@@ -602,20 +602,6 @@
     }
 }
 
-method do_args($/) {
-    my $params := PAST::Stmts.new( :node($/) );
-    my $past := PAST::Block.new($params, :blocktype('declaration'));
-    for $<identifier> {
-        my $parameter := $( $_ );
-        $past.symbol($parameter.name(), :scope('lexical'));
-        $parameter.scope('parameter');
-        $params.push($parameter);
-    }
-    $params.arity( +$<identifier> );
-    our $?BLOCK_SIGNATURED := $past;
-    make $past;
-}
-
 method args($/) {
     my $past := PAST::Op.new( :pasttype('call'), :node($/) );
     for $<arg> {

Modified: trunk/languages/cardinal/src/parser/grammar.pg
==============================================================================
--- trunk/languages/cardinal/src/parser/grammar.pg      (original)
+++ trunk/languages/cardinal/src/parser/grammar.pg      Thu Aug 14 06:50:33 2008
@@ -146,7 +146,15 @@
 }
 
 rule do_args {
-    '|' [ <identifier> [',' <identifier>]*]?'|' {*}
+    '|' <block_signature> '|'
+}
+
+rule block_signature {
+    [
+    | <identifier> [',' <identifier>]* [',' <slurpy_param>]? [',' 
<block_param>]?
+    | <slurpy_param> [',' <block_param>]?
+    | <block_param>?
+    ] {*}
 }
 
 token variable {
@@ -188,6 +196,7 @@
     | <literal> {*}                         #= literal
     | <funcall> {*}                         #= funcall
     | <variable> {*}                        #= variable
+    | <do_block> {*}                        #= do_block
     | <array> {*}                           #= array
     | <ahash> {*}                           #= ahash
     | <pcomp_stmt> {*}                      #= pcomp_stmt
@@ -298,12 +307,8 @@
 
 rule argdecl {
     ['('
-    [ <identifier> [',' <identifier>]* [',' <slurpy_param>]? [',' 
<block_param>]?
-    | <slurpy_param> [',' <block_param>]?
-    | <block_param>?
-    ]
+    <block_signature>
     ')']?
-    {*}
 }
 
 token slurpy_param {

Reply via email to