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 {