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