Author: bernhard
Date: Wed Mar 14 13:57:33 2007
New Revision: 17482

Modified:
   trunk/languages/plumhead/TODO
   trunk/languages/plumhead/src/partridge/Plumhead.pg
   trunk/languages/plumhead/src/partridge/PlumheadPAST.tg

Log:
[Plumhead partridge]
Get associativity right for '1 - 2 - 10'


Modified: trunk/languages/plumhead/TODO
==============================================================================
--- trunk/languages/plumhead/TODO       (original)
+++ trunk/languages/plumhead/TODO       Wed Mar 14 13:57:33 2007
@@ -1,6 +1,7 @@
 # $Id$
 
 TODO:
+  - add --target option for the non-partridge variants
   - segfault array_3.php with Partridge antlr3
   - unified testing
   - Implementation with PGE, make it the default implementation

Modified: trunk/languages/plumhead/src/partridge/Plumhead.pg
==============================================================================
--- trunk/languages/plumhead/src/partridge/Plumhead.pg  (original)
+++ trunk/languages/plumhead/src/partridge/Plumhead.pg  Wed Mar 14 13:57:33 2007
@@ -72,9 +72,9 @@
 rule bitwise_tail             { <BITWISE_OP> <adding_expression> }
 
 # BUG: this gets precedence  wrong
-rule adding_expression        { <multiplying_expression> <adding_tail>? }
+rule adding_expression        { <multiplying_expression> <adding_tail>* }
 
-rule adding_tail              { <ADD_OP> <adding_expression> }
+rule adding_tail              { <ADD_OP> <multiplying_expression> }
 
 # TODO: this gets precedence  wrong
 rule multiplying_expression   { <unary_expression> <multiplicand>? }

Modified: trunk/languages/plumhead/src/partridge/PlumheadPAST.tg
==============================================================================
--- trunk/languages/plumhead/src/partridge/PlumheadPAST.tg      (original)
+++ trunk/languages/plumhead/src/partridge/PlumheadPAST.tg      Wed Mar 14 
13:57:33 2007
@@ -70,12 +70,12 @@
 
     $P0 = node['statement']
     if null $P0 goto handled_statement
-        .local pmc iter
-        iter = new .Iterator, $P0
+        .local pmc statement_iter
+        statement_iter = new .Iterator, $P0
         iter_loop:
-            unless iter goto iter_end
+            unless statement_iter goto iter_end
             .local pmc cnode, past_else_block, past_condition, 
past_expression, past_var, past_array_elem, past_assign, past_rel_expression, 
past_echo, past_if, past_if_block, past_sea
-            cnode = shift iter
+            cnode = shift statement_iter
             if null cnode goto iter_loop
 
                  $P1 = cnode['ECHO']
@@ -258,25 +258,30 @@
 
     $P0 = node['adding_expression']
     if null $P0 goto no_adding_expression
-        .local pmc past_mult, adding_tail, adding_tail_0, past_adding_tail_0
+        .local pmc adding_tail_iter, past_mult, past_prev, adding_tail 
+        past = tree.'get'('past', $P0, 'Plumhead::Grammar::expression')
         adding_tail = $P0['adding_tail']
-        if null adding_tail goto no_adding_tail
-            past_mult = tree.'get'('past', $P0, 
'Plumhead::Grammar::expression')
-            adding_tail_0 = adding_tail[0]
-            .local string add_op, pirop
-            pirop = 'n_add'
-            add_op = adding_tail_0['ADD_OP']
-            if add_op != '-' goto not_minus
-                pirop = 'n_sub'
-            not_minus:
-            add_op = 'infix:' . add_op 
-            past_adding_tail_0 = tree.'get'('past', adding_tail_0, 
'Plumhead::Grammar::expression')
-            past = new 'PAST::Op'
-            past.init( past_mult, past_adding_tail_0, 'name' => add_op, 
'pirop' => pirop )
+        if null adding_tail goto handled_expression
+            .local pmc past_prev, cnode 
+            adding_tail_iter = new .Iterator, adding_tail
+            iter_loop:
+                unless adding_tail_iter goto iter_end
+                .local pmc cnode
+                cnode = shift adding_tail_iter
+                past_mult = tree.'get'('past', cnode, 
'Plumhead::Grammar::expression')
+                past_prev = past
+                .local string add_op, pirop
+                pirop = 'n_add'
+                add_op = cnode['ADD_OP']
+                if add_op != '-' goto not_minus
+                    pirop = 'n_sub'
+                not_minus:
+                add_op = 'infix:' . add_op 
+                past = new 'PAST::Op'
+                past.init( past_prev, past_mult, 'name' => add_op, 'pirop' => 
pirop )
+                goto iter_loop
+            iter_end:
             goto handled_expression
-        no_adding_tail:
-        past = tree.'get'('past', $P0, 'Plumhead::Grammar::expression')
-    goto handled_expression
     no_adding_expression:
 
     $P0 = node['multiplying_expression']

Reply via email to