--- 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