compiler/PPCCodeGenerator.st
changeset 489 0ca7a70db0f5
parent 488 19a9c25960ef
child 491 82b272c7dc37
--- a/compiler/PPCCodeGenerator.st	Mon Jun 15 19:13:49 2015 +0100
+++ b/compiler/PPCCodeGenerator.st	Tue Jun 16 06:45:26 2015 +0100
@@ -686,7 +686,7 @@
 
 visitSequenceNode: node
 
-    | elementVars mementoVar canBacktrack |
+    | elementVars mementoVar canBacktrack coding |
 
     elementVars := node preferredChildrenVariableNames.
     elementVars do:[:e | 
@@ -708,34 +708,47 @@
         compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
     ].
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:(node children at:1) ]
-          to:(elementVars at:1).
-    compiler add: 'error ifTrue: [ ^ failure ].'.
-    node returnParsedObjectsAsCollection ifTrue:[
-        compiler add: self retvalVar , ' at: 1 put: ', (elementVars at: 1), '.'.
+    coding := [ :index |
+        | child childValueVar |
+
+        child := node children at: index.
+        childValueVar := elementVars at: index.
+        compiler codeAssignParsedValueOf: [ self visit:child ] 
+                                      to: childValueVar.
+        child acceptsEpsilon ifFalse: [   
+            compiler codeIfErrorThen: [
+                "Handle error in the first element specially"
+                "TODO: JK, please explain here why!!!!!!"
+                index == 1 ifTrue:[                         
+                    compiler add: 'error ifTrue: [ ^ failure ].'.
+                ] ifFalse:[
+                    compiler smartRestore: node from: mementoVar.
+                    compiler codeReturn: 'failure.'.
+                ]
+            ] else:[ 
+                node returnParsedObjectsAsCollection ifTrue:[
+                    compiler add: self retvalVar , ' at: ', index asString, ' put: ', childValueVar, '.'.
+                ].
+                (index < node children size) ifTrue:[ 
+                    coding value: index + 1.
+                ].
+            ]
+
+        ] ifTrue:[
+            node returnParsedObjectsAsCollection ifTrue:[
+                compiler add: self retvalVar , ' at: ', index asString, ' put: ', childValueVar, '.'.
+            ].
+            (index < node children size) ifTrue:[ 
+                coding value: index + 1.
+            ].
+        ]
     ].
-    2 to: (node children size) do: [ :idx  | |child|
-        child := node children at: idx.
-        compiler 
-              codeAssignParsedValueOf:[ self visit:child ]
-              to:(elementVars at:idx).
-      
-        child acceptsEpsilon ifFalse: [   
-            compiler add: 'error ifTrue: [ '.
-            compiler indent.
-            compiler smartRestore: node from: mementoVar.
-            compiler codeReturn: 'failure.'.
-            compiler dedent.
-            compiler add: '].'.
-        ].
-        node returnParsedObjectsAsCollection ifTrue:[
-            compiler add: self retvalVar , ' at: ', idx asString, ' put: ',(elementVars at: idx),'.'.
-        ].
-    ].
+
+    coding value:1.
+
     compiler codeReturn
 
-    "Modified: / 04-06-2015 / 23:47:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 16-06-2015 / 06:38:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitStarAnyNode: node