compiler/PPCCodeGenerator.st
changeset 474 62b5330d8b23
parent 465 f729f6cd3c76
child 476 c45383095de4
--- a/compiler/PPCCodeGenerator.st	Tue May 26 07:27:15 2015 +0100
+++ b/compiler/PPCCodeGenerator.st	Wed May 27 03:30:35 2015 +0100
@@ -292,33 +292,49 @@
 !
 
 visitChoiceNode: node
-    |  whitespaceConsumed elementVar |
-    "The code is not ready for inlining"
-    self assert: node isMarkedForInline not.
-    
+    |  whitespaceConsumed allowGuard elementVar coding |
+
 
     elementVar := compiler allocateTemporaryVariableNamed: 'element'.
-    whitespaceConsumed :=	 self addGuardTrimming: node.
-
-    1 to: node children size do: [ :idx  | |child allowGuard |
-        child := node children at: idx.
-        allowGuard := whitespaceConsumed.
+    whitespaceConsumed := self addGuardTrimming: node.
+    allowGuard := whitespaceConsumed.
 
-        allowGuard ifTrue: [ 
-            self addGuard: child ifTrue: [ 
-                compiler add: 'self clearError.'.
-                compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
-                compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'.
-            ] ifFalse: nil.
-        ] ifFalse: [ 
-                compiler add: 'self clearError.'.
-                compiler codeStoreValueOf:  [self visit: child] intoVariable: elementVar.
-                compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'.
+    allowGuard ifTrue:[
+        coding := 
+            [ :children :index |
+                self addGuard: (children at: index) ifTrue: [ 
+                    compiler add: 'self clearError.'.
+                    compiler codeStoreValueOf:  [self visit: (children at: index)] intoVariable: elementVar.
+                    compiler add: 'error ifFalse: [ '.
+                    compiler codeReturn: elementVar.  
+                    compiler add: ' ].'.
+                ] ifFalse:[  
+                    index < children size ifTrue:[ 
+                        coding value: children value: index + 1.
+                    ] ifFalse:[ 
+                        compiler codeError: 'no choice suitable'.
+                    ].
+                ]
         ]
+    ] ifFalse:[ 
+        coding := 
+            [ :children :index |
+                index <= children size ifTrue:[ 
+                    compiler add: 'self clearError.'.
+                    compiler codeStoreValueOf:  [self visit: (children at: index)] intoVariable: elementVar.
+                    compiler add: 'error ifFalse: [ '.
+                    compiler codeReturn: elementVar.  
+                    compiler add: ' ].'.
+                    coding value: children value: index + 1.
+                ] ifFalse:[ 
+                    compiler codeError: 'no choice suitable'.
+                ].
+            ]
     ].
-    compiler codeError: 'no choice suitable'.
 
-    "Modified: / 05-05-2015 / 14:10:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    coding value: node children value: 1.
+
+    "Modified: / 26-05-2015 / 19:02:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitEndOfFileNode: node
@@ -329,10 +345,12 @@
 
     compiler codeStoreValueOf: [ self visit: node child ] intoVariable: self retvalVar.
     compiler add: 'context atEnd ifTrue: ['.
-    compiler codeReturn.	
+    compiler codeReturn.        
     compiler add: '] ifFalse: ['.
     compiler codeError: 'End of input expected'.
-    compiler add: ']'.
+    compiler add: '].'.
+
+    "Modified: / 26-05-2015 / 19:03:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitForwardNode: node
@@ -475,7 +493,7 @@
                 
     elementVar := compiler allocateTemporaryVariableNamed:  'element'.
      
-"	self tokenGuards ifTrue: [ 
+"       self tokenGuards ifTrue: [ 
         compiler codeTokenGuard: node ifFalse: [ compiler codeError: 'at least one occurence expected' ].   
     ].
 "        
@@ -486,21 +504,26 @@
     compiler codeError: 'at least one occurence expected'.
     compiler add: '] ifFalse: ['.
     compiler indent.
-        compiler add: self retvalVar , ' add: ',elementVar , '.'.
-            
+        (self retvalVar ~~ #whatever) ifTrue:[
+            compiler add: self retvalVar , ' add: ',elementVar , '.'.
+        ].            
         compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
         compiler add: '[ error ] whileFalse: ['.
         compiler indent.
-        compiler add: self retvalVar , ' add: ',elementVar , '.'.
+        (self retvalVar ~~ #whatever) ifTrue:[
+            compiler add: self retvalVar , ' add: ',elementVar , '.'.
+        ].
         compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar.
         compiler dedent.
         compiler add: '].'.
         compiler add: 'self clearError.'.
-        compiler codeReturn: self retvalVar , ' asArray.'.         
+        (self retvalVar ~~ #whatever) ifTrue:[ 
+            compiler codeReturn: self retvalVar , ' asArray.'.         
+        ].
     compiler dedent.
     compiler add: '].'.
 
-    "Modified (comment): / 23-04-2015 / 21:30:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-05-2015 / 19:04:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitPredicateNode: node