Author: kjs
Date: Sat Jan 26 08:20:46 2008
New Revision: 25255

Modified:
   trunk/languages/ecmascript/src/parser/actions.pm
   trunk/languages/ecmascript/src/parser/grammar.pg

Log:
[ecmascript] fix actions for assignment stuff.

Modified: trunk/languages/ecmascript/src/parser/actions.pm
==============================================================================
--- trunk/languages/ecmascript/src/parser/actions.pm    (original)
+++ trunk/languages/ecmascript/src/parser/actions.pm    Sat Jan 26 08:20:46 2008
@@ -309,9 +309,6 @@
     #}
 }
 
-#method member_expression($/) {
-#    make $( $<primary_expression> );
-#}
 
 method call_expression($/) {
     my $invocant := $( $<member_expression> );
@@ -336,10 +333,22 @@
 }
 
 method assignment_expression($/) {
-   # make $( $<expression> );
-   my $past;
-   $past := $( $<conditional_expression> );
-   make $past;
+    my $past := $( $<conditional_expression> );
+
+    # get number of lhs_expressions
+    my $lhsexpr := +$<lhs_expression>;
+
+    # assignments such as 'a=b=c' are evaluated from right to left
+    # first c is assigned to b, that result (b) is assigned to a.
+    # therefore, loop through the array backwards.
+    while $lhsexpr != 0 {
+        # generate the name of the assignment operator
+        my $op  := 'infix:' ~ ~$<assignop>[$lhsexpr - 1];
+        my $lhs := $( $<lhs_expression>[$lhsexpr - 1] );
+        $past := PAST::Op.new( $lhs, $past, :name($op), :pasttype('call'), 
:node($/) );
+        $lhsexpr := $lhsexpr - 1;
+    }
+    make $past;
 }
 
 method conditional_expression($/) {
@@ -363,6 +372,7 @@
 }
 
 method unop($/) {
+    # create a call op to invoke the specified unary operand.
     my $operator := 'prefix:' ~ ~$<op>;
     make PAST::Op.new( :name($operator), :pasttype('call'), :node($/) );
 }
@@ -370,32 +380,50 @@
 method postfix_expression($/) {
     my $past := $( $<lhs_expression> );
     if $<postfixop> {
-        if $<postfixop>[0] eq '++' {
-
-        }
-        elsif $<postfixop>[0] eq '--' {
-
-        }
+        # create a string "postfix:++" or "postfix:--"
+        my $postfixop := 'postfix:' ~ ~$<postfixop>[0];
+        # create an invocation of this operator, providing
+        # the <lhs_expression> as its operand
+        $past := PAST::Op.new( $past,
+                               :pasttype('call'),
+                               :name($postfixop),
+                               :node($/)
+                             );
     }
     make $past;
 }
 
 method expression($/) {
-   # XXX handle comma operator and other assignment_expressions
-   # for $<assignment_expression {
-   #   $( $_ );
-   # }
-   make $( $<assignment_expression>[0] );
+    my $past := PAST::Stmts.new( :node($/) );
+    for $<assignment_expression> {
+        $past.push( $( $_ ) );
+    }
+    make $past;
 }
 
+#######
 method lhs_expression($/, $key) {
     make $( $/{$key} );
 }
 
 method member_expression($/) {
-    make $( $<member> );
+    my $member := $( $<member> );
+    if $<arguments> {
+        # $<member> is the invocant
+        my $past := PAST::Op.new( $member, :pasttype('call'), :node($/) );
+        my @args := $<arguments><assignment_expression>;
+        for @args {
+            $past.push( $($_) );
+        }
+        make $past;
+    }
+    else {
+        make $member;
+    }
 }
 
+
+
 method member($/) {
     my $past;
     if $<primary_expression> {
@@ -527,5 +555,5 @@
         }
         make $past;
     }
+}
 
-}
\ No newline at end of file

Modified: trunk/languages/ecmascript/src/parser/grammar.pg
==============================================================================
--- trunk/languages/ecmascript/src/parser/grammar.pg    (original)
+++ trunk/languages/ecmascript/src/parser/grammar.pg    Sat Jan 26 08:20:46 2008
@@ -43,10 +43,10 @@
 ##
 
 rule statement {
+    | <expression_statement> {*}  #= expression_statement
     | <block> {*}                 #= block
     | <variable_statement> {*}    #= variable_statement
     | <empty_statement> {*}       #= empty_statement
-    | <expression_statement> {*}  #= expression_statement
     | <if_statement> {*}          #= if_statement
     | <while_statement> {*}       #= while_statement
     | <do_while_statement> {*}    #= do_while_statement
@@ -397,7 +397,7 @@
     {*}
 }
 
-token assignop {
+rule assignop {
     $<op>=['='|'*='|'/='|'%='|'+='|'-='|'<<='|'>>='|'>>>='|'&='|'^='|'|=']
 }
 

Reply via email to