Author: tene
Date: Sun Aug 10 22:02:10 2008
New Revision: 30162

Modified:
   trunk/languages/cardinal/src/builtins/guts.pir
   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/08-class.t
   trunk/languages/cardinal/t/99-other.t

Log:
[cardinal]
Call nullary subs when mentioned by name.


Modified: trunk/languages/cardinal/src/builtins/guts.pir
==============================================================================
--- trunk/languages/cardinal/src/builtins/guts.pir      (original)
+++ trunk/languages/cardinal/src/builtins/guts.pir      Sun Aug 10 22:02:10 2008
@@ -212,6 +212,18 @@
     $I0 = defined x
     .return ($I0)
 .end
+
+.sub 'lex_lookup'
+    .param string name
+    $P0 = find_name name
+    .return($P0)
+.end
+
+.sub 'lookup_class'
+    .param pmc item
+    $P0 = class item
+    .return($P0)
+.end
 # Local Variables:
 #   mode: pir
 #   fill-column: 100

Modified: trunk/languages/cardinal/src/parser/actions.pm
==============================================================================
--- trunk/languages/cardinal/src/parser/actions.pm      (original)
+++ trunk/languages/cardinal/src/parser/actions.pm      Sun Aug 10 22:02:10 2008
@@ -247,7 +247,11 @@
 }
 
 method varname($/, $key) {
-    make $( $/{$key} );
+    my $past := $( $/{$key} );
+    if is_a_sub(~$/) { # unary sub
+        $past := PAST::Op.new( :pasttype('call'), :node($/), $past );
+    }
+    make $past;
 }
 
 method global($/) {
@@ -324,6 +328,10 @@
     make $past;
 }
 
+method funcall($/) {
+    my $past := $( $<local_variable> );
+    make $past;
+}
 
 method constant_variable($/) {
     my @a;
@@ -491,12 +499,13 @@
 method functiondef($/) {
     my $past := $( $<comp_stmt> );
     my $name := $<fname>;
+    my $arity := $past[0]<arity>;
     #my $args := $( $<argdecl> );
     #$past.push($args);
     $past.name(~$name);
     our $?BLOCK;
     our $?CLASS;
-    $?BLOCK.symbol(~$name, :scope('package'));
+    $?BLOCK.symbol(~$name, :scope('package'), :arity($arity));
     if defined($?CLASS) {
         $past.pirflags(':method');
     }
@@ -719,6 +728,34 @@
     }
 }
 
+sub is_a_sub($name) {
+    our $?BLOCK;
+    our @?BLOCK;
+    if $?BLOCK.symbol(~$name) {
+        if defined($?BLOCK.symbol(~$name)<arity>) {
+            return(1);
+        }
+        else {
+            return(0);
+        }
+    }
+    for @?BLOCK {
+        if $_ {
+            my $sym_table := $_.symbol(~$name);
+            if $sym_table {
+                if defined($sym_table<arity>) {
+                    return(1);
+                }
+                else {
+                    return(0);
+                }
+            }
+        }
+    }
+    my $lex := lex_lookup($name);
+    if $lex && ~lookup_class($lex) eq 'Sub' { return(1); }
+    return(0);
+}
 
 # Local Variables:
 #   mode: cperl

Modified: trunk/languages/cardinal/src/parser/grammar.pg
==============================================================================
--- trunk/languages/cardinal/src/parser/grammar.pg      (original)
+++ trunk/languages/cardinal/src/parser/grammar.pg      Sun Aug 10 22:02:10 2008
@@ -165,6 +165,10 @@
     ]
 }
 
+token funcall {
+    <!reserved_word> <local_variable> <.before \s|'('> <.before <call_args>> 
{*}
+}
+
 token mrhs {
     <args> {*}
 }
@@ -182,6 +186,7 @@
 
 token basic_primary {
     | <literal> {*}                         #= literal
+    | <funcall> {*}                         #= funcall
     | <variable> {*}                        #= variable
     | <array> {*}                           #= array
     | <ahash> {*}                           #= ahash

Modified: trunk/languages/cardinal/t/02-functions.t
==============================================================================
--- trunk/languages/cardinal/t/02-functions.t   (original)
+++ trunk/languages/cardinal/t/02-functions.t   Sun Aug 10 22:02:10 2008
@@ -21,7 +21,7 @@
   end
 end
 
-first()
+first
 second(2)
 third(3,4)
 second fib(6) - 3;

Modified: trunk/languages/cardinal/t/08-class.t
==============================================================================
--- trunk/languages/cardinal/t/08-class.t       (original)
+++ trunk/languages/cardinal/t/08-class.t       Sun Aug 10 22:02:10 2008
@@ -56,9 +56,9 @@
     end
 end
 
-x = StaticTester.new()
+x = StaticTester.new
 x.num = 6
-y = StaticTester.new()
+y = StaticTester.new
 y.speak
 y.num = y.num + 1
 x.speak

Modified: trunk/languages/cardinal/t/99-other.t
==============================================================================
--- trunk/languages/cardinal/t/99-other.t       (original)
+++ trunk/languages/cardinal/t/99-other.t       Sun Aug 10 22:02:10 2008
@@ -10,4 +10,4 @@
     return [ 9, 6, 7 ]
 end
 
-foo()[1].upto(7) { |i| puts "ok ", i }
+foo[1].upto(7) { |i| puts "ok ", i }

Reply via email to