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