Author: tene
Date: Sat Feb 23 00:35:43 2008
New Revision: 26008
Added:
trunk/languages/cardinal/t/02-functions.t
Modified:
trunk/languages/cardinal/src/parser/actions.pm
trunk/languages/cardinal/src/parser/grammar.pg
Log:
Very very basic function support for cardinal.
Allow defining functions that accept parameters.
Allow calling functions with ()s.
A few minor grammar fixes.
Modified: trunk/languages/cardinal/src/parser/actions.pm
==============================================================================
--- trunk/languages/cardinal/src/parser/actions.pm (original)
+++ trunk/languages/cardinal/src/parser/actions.pm Sat Feb 23 00:35:43 2008
@@ -86,8 +86,8 @@
## not entirely sure what alias does, but this is a guess...
method alias($/) {
- my $fname := $( $<fname>[0] );
- my $alias := $( $<fname>[1] );
+ my $fname := $<fname>[0];
+ my $alias := $<fname>[1];
make PAST::Op.new( $alias, $fname, :pasttype('bind'), :node($/) );
}
@@ -154,7 +154,7 @@
}
method local_variable($/) {
- make PAST::Var.new( :name(~$/), :scope('package'), :node($/) );
+ make PAST::Var.new( :name(~$/), :scope('lexical'), :node($/),
:viviself('Undef') );
}
@@ -220,16 +220,18 @@
}
method functiondef($/) {
- my $name := $( $<fname> );
- my $past := $( $<argdecl> );
- $past.name($name.name());
+ my $past := PAST::Block.new( :blocktype('declaration'), :node($/) );
+ my $name := $<fname>;
+ my $args := $( $<argdecl> );
+ $past.name($name);
my $body := $( $<comp_stmt> );
+ $past.push($args);
$past.push($body);
make $past;
}
method argdecl($/) {
- my $past := PAST::Block.new( :blocktype('declaration'), :node($/) );
+ my $past := PAST::Stmts.new( :node($/) );
for $<identifier> {
my $param := $( $_ );
$param.scope('parameter');
@@ -258,12 +260,8 @@
make $past;
}
-method fname($/, $key) {
- make $( $/{$key} );
-}
-
method identifier($/) {
- make PAST::Var.new( :name(~$<ident>), :scope('package'), :node($/) );
+ make PAST::Var.new( :name(~$<ident>), :node($/) );
}
method module_identifier($/) {
@@ -279,7 +277,7 @@
}
method call($/) {
- my $op := $( $<operation> );
+ my $op := $<operation>;
my $past := $( $<call_args> );
if $<primary> {
@@ -288,7 +286,7 @@
$past.unshift($invocant);
}
- $past.unshift($op);
+ $past.name($op);
make $past;
}
Modified: trunk/languages/cardinal/src/parser/grammar.pg
==============================================================================
--- trunk/languages/cardinal/src/parser/grammar.pg (original)
+++ trunk/languages/cardinal/src/parser/grammar.pg Sat Feb 23 00:35:43 2008
@@ -21,15 +21,13 @@
{*}
}
-## XXX figure out if this \n* thing is good here.
token comp_stmt {
- \n* <stmts> <.term>*
+ <stmts>
{*}
}
rule stmts {
- [ <stmt> [ <.term>+ <stmt> ]* ]?
- {*}
+ <.term>?[ <stmt> <.term>+]* {*}
}
rule term { \n | ';' }
@@ -112,12 +110,12 @@
{*}
}
-rule member_variable {
+token member_variable {
<primary> '.' <identifier>
{*}
}
-rule command {
+token command {
| <call> {*} #= call
| <super_call> {*} #= super_call
}
@@ -138,13 +136,13 @@
{*}
}
-rule operation {
- <identifier> ['!'|'?']?
- {*}
+token operation {
+ <.identifier> ('!'|'?')?
}
-rule call_args {
+token call_args {
| <args> {*}
+ | '(' <.ws> <args> <.ws> ')' {*}
}
rule variable {
@@ -172,6 +170,7 @@
rule 'arg' is optable { ... }
+proto 'infix:=' is precedence('1') is pasttype('copy') is lvalue(1) { ... }
@@ -306,8 +305,8 @@
{*}
}
-rule fname {
- | <identifier> {*} #= identifier
+token fname {
+ <.identifier>
}
rule array {
@@ -335,7 +334,7 @@
}
token module_identifier {
- <[A..Z]> <ident>
+ <before <[A..Z]>> <ident>
{*}
}
@@ -355,12 +354,12 @@
}
token local_variable {
- <[a..z_]> <ident>
+ <before <[a..z_]>> <ident>
{*}
}
token constant_variable {
- <[A..Z]> <ident>
+ <before <[A..Z]>> <ident>
{*}
}
@@ -402,7 +401,7 @@
}
-proto 'infix:=' is precedence('1') { ... }
+proto 'infix:=' is precedence('1') is pasttype('copy') is lvalue(1) { ... }
proto 'prefix:defined?' is looser('infix:=') { ... }
Added: trunk/languages/cardinal/t/02-functions.t
==============================================================================
--- (empty file)
+++ trunk/languages/cardinal/t/02-functions.t Sat Feb 23 00:35:43 2008
@@ -0,0 +1,18 @@
+print "1..4\n"
+
+def first
+ print "ok 1"
+end
+
+def second(n)
+ print "ok ", n
+end
+
+def third(a,b)
+ second(a)
+ second(b)
+end
+
+first()
+second(2)
+third(3,4)