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)

Reply via email to