Author: tene
Date: Thu Aug 14 06:50:44 2008
New Revision: 30228

Modified:
   trunk/languages/cardinal/src/parser/actions.pm
   trunk/languages/cardinal/src/parser/grammar.pg
   trunk/languages/cardinal/t/02-functions.t
   trunk/languages/cardinal/t/99-other.t

Log:
[cardinal]
* Properly handle functions tha accept block parameters
* Properly pass block arguments to function calls


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:44 2008
@@ -526,9 +526,11 @@
     }
 
     if $<block_param> {
-
+        my $block := $( $<block_param>[0] );
+        $past.symbol($block.name(), :scope('lexical'));
+        $params.push($block);
     }
-    $params.arity( +$<identifier> );
+    $params.arity( +$<identifier> + +$<block_param> );
     our $?BLOCK_SIGNATURED := $past;
     make $past;
 }
@@ -542,7 +544,7 @@
 
 method block_param($/) {
     my $past := $( $<identifier> );
-    # XXX
+    $past.scope('parameter');
     make $past;
 }
 
@@ -594,12 +596,17 @@
 }
 
 method call_args($/) {
-    if ~$/ ne '()' {
-        make $( $<args> );
+    my $past;
+    if $<args> {
+        $past := $( $<args> );
     }
     else {
-        make PAST::Op.new( :pasttype('call'), :node($/) );
+        $past := PAST::Op.new( :pasttype('call'), :node($/) );
     }
+    if $<do_block> {
+        $past.push( $( $<do_block>[0] ) );
+    }
+    make $past;
 }
 
 method args($/) {

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:44 2008
@@ -139,10 +139,11 @@
     <.identifier> ('!'|'?')?
 }
 
+#XXX UGLY!  Refactor into <args> maybe?
 token call_args {
-    | '()' {*}
-    | <args> {*}
-    | '(' <.ws> <args> <.ws> ')' {*}
+    | '()' [<.ws> <do_block>]? {*}
+    | <args> [<.ws> <do_block>]? {*}
+    | '(' <.ws> <args> <.ws> ')' [<.ws> <do_block>]? {*}
 }
 
 rule do_args {

Modified: trunk/languages/cardinal/t/02-functions.t
==============================================================================
--- trunk/languages/cardinal/t/02-functions.t   (original)
+++ trunk/languages/cardinal/t/02-functions.t   Thu Aug 14 06:50:44 2008
@@ -1,4 +1,4 @@
-puts "1..5"
+puts "1..6"
 
 def first
     puts "ok 1"
@@ -21,7 +21,14 @@
   end
 end
 
+def blocks(n,&f)
+    f(n)
+end
+
 first
 second(2)
 third(3,4)
 second fib(6) - 3;
+blocks(6) do |i|
+    puts 'ok ', i
+end

Modified: trunk/languages/cardinal/t/99-other.t
==============================================================================
--- trunk/languages/cardinal/t/99-other.t       (original)
+++ trunk/languages/cardinal/t/99-other.t       Thu Aug 14 06:50:44 2008
@@ -1,4 +1,4 @@
-puts "1..7"
+puts "1..8"
 
 n = 5
 
@@ -11,3 +11,11 @@
 end
 
 foo[1].upto(7) { |i| puts "ok ", i }
+
+a = do |a,&f|
+    f(a)
+end
+
+a(8) do |i|
+    puts 'ok ', i
+end

Reply via email to