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>=['='|'*='|'/='|'%='|'+='|'-='|'<<='|'>>='|'>>>='|'&='|'^='|'|='] }