Author: tene
Date: Sun Jul 20 15:43:06 2008
New Revision: 29633

Modified:
   trunk/languages/cardinal/src/classes/Object.pir
   trunk/languages/cardinal/src/parser/actions.pm
   trunk/languages/cardinal/src/parser/grammar.pg
   trunk/languages/cardinal/t/08-class.t

Log:
[cardinal]
* Member assignment syntax
* Fix class instantiation for classes without an initialize()


Modified: trunk/languages/cardinal/src/classes/Object.pir
==============================================================================
--- trunk/languages/cardinal/src/classes/Object.pir     (original)
+++ trunk/languages/cardinal/src/classes/Object.pir     Sun Jul 20 15:43:06 2008
@@ -139,7 +139,11 @@
     cardinalmeta = get_hll_global ['CardinalObject'], '!CARDINALMETA'
     $P0 = cardinalmeta.get_parrotclass(self)
     $P1 = $P0.'new'()
+    $P2 = $P1.'HOW'()
+    $I0 = $P2.can('initialize')
+    unless $I0, no_initialize
     $P2 = $P1.'initialize'(args :flat, named_args :named :flat)
+  no_initialize:
 
     .return ($P1)
 .end

Modified: trunk/languages/cardinal/src/parser/actions.pm
==============================================================================
--- trunk/languages/cardinal/src/parser/actions.pm      (original)
+++ trunk/languages/cardinal/src/parser/actions.pm      Sun Jul 20 15:43:06 2008
@@ -156,6 +156,17 @@
 
     make $past;
 }
+method member_assignment($/) {
+    my $rhs := $( $<rhs> );
+    my $primary := $( $<basic_primary> );
+
+    my $past := PAST::Op.new( :name(~$<key><ident> ~ '='), 
:pasttype('callmethod'), :node($/) );
+
+    $past.push( $primary );
+    $past.push( $rhs );
+
+    make $past;
+}
 method assignment($/) {
     my $lhs := $( $<mlhs> );
     our $?BLOCK;

Modified: trunk/languages/cardinal/src/parser/grammar.pg
==============================================================================
--- trunk/languages/cardinal/src/parser/grammar.pg      (original)
+++ trunk/languages/cardinal/src/parser/grammar.pg      Sun Jul 20 15:43:06 2008
@@ -4,13 +4,11 @@
 
 This is the grammar for cardinal written as a sequence of Perl 6 rules.
 
-Currently taken (partly) from:
+Originally taken (partly) from:
 http://www.math.hokudai.ac.jp/~gotoken/ruby/man/yacc.html
 
 and parse.y from the ruby source
 
-But adapted here and there; it's not entirely correct, it seems.
-
 =end overview
 
 grammar cardinal::Grammar is PCT::Grammar;
@@ -45,6 +43,7 @@
     | <module> {*}          #= module
     | <begin_end> {*}       #= begin_end
     | <indexed_assignment> {*}      #= indexed_assignment
+    | <member_assignment> {*}      #= member_assignment
     | <assignment> {*}      #= assignment
     | <return_stmt> {*}     #= return_stmt
     | <expr> {*}            #= expr
@@ -91,6 +90,11 @@
     {*}
 }
 
+token member_assignment {
+    <basic_primary> '.' <key=identifier> <.ws> '=' <.ws> <rhs=arg>
+    {*}
+}
+
 rule assignment {
     <mlhs=lhs> '=' <mrhs=arg>       #XXX need to figure out multiple assignment
     {*}
@@ -317,7 +321,7 @@
 }
 
 token fname {
-    <.identifier>
+    <.identifier> <[=!?]>?
 }
 
 rule array {

Modified: trunk/languages/cardinal/t/08-class.t
==============================================================================
--- trunk/languages/cardinal/t/08-class.t       (original)
+++ trunk/languages/cardinal/t/08-class.t       Sun Jul 20 15:43:06 2008
@@ -1,4 +1,4 @@
-puts '1..4'
+puts '1..5'
 
 class OkayOnCreate
     def initialize(a)
@@ -24,12 +24,22 @@
     def inc
         @num = @num + 1
     end
+
+    def num()
+        @num
+    end
+
+    def num=(val)
+        @num = val
+    end
 end
 
 b = OkaySayer.new(2)
 
-b.speak()
+b.speak
 b.setnum(3)
-b.speak()
-b.inc()
-b.speak()
+b.speak
+b.inc
+b.speak
+b.num = b.num + 1
+puts "ok ", b.num

Reply via email to