706 |
706 |
707 node returnParsedObjectsAsCollection ifTrue:[ |
707 node returnParsedObjectsAsCollection ifTrue:[ |
708 compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar. |
708 compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar. |
709 ]. |
709 ]. |
710 |
710 |
711 compiler |
711 coding := [ :index | |
712 codeAssignParsedValueOf:[ self visit:(node children at:1) ] |
712 | child childValueVar | |
713 to:(elementVars at:1). |
713 |
714 compiler add: 'error ifTrue: [ ^ failure ].'. |
714 child := node children at: index. |
715 node returnParsedObjectsAsCollection ifTrue:[ |
715 childValueVar := elementVars at: index. |
716 compiler add: self retvalVar , ' at: 1 put: ', (elementVars at: 1), '.'. |
716 compiler codeAssignParsedValueOf: [ self visit:child ] |
717 ]. |
717 to: childValueVar. |
718 2 to: (node children size) do: [ :idx | |child| |
|
719 child := node children at: idx. |
|
720 compiler |
|
721 codeAssignParsedValueOf:[ self visit:child ] |
|
722 to:(elementVars at:idx). |
|
723 |
|
724 child acceptsEpsilon ifFalse: [ |
718 child acceptsEpsilon ifFalse: [ |
725 compiler add: 'error ifTrue: [ '. |
719 compiler codeIfErrorThen: [ |
726 compiler indent. |
720 "Handle error in the first element specially" |
727 compiler smartRestore: node from: mementoVar. |
721 "TODO: JK, please explain here why!!!!!!" |
728 compiler codeReturn: 'failure.'. |
722 index == 1 ifTrue:[ |
729 compiler dedent. |
723 compiler add: 'error ifTrue: [ ^ failure ].'. |
730 compiler add: '].'. |
724 ] ifFalse:[ |
731 ]. |
725 compiler smartRestore: node from: mementoVar. |
732 node returnParsedObjectsAsCollection ifTrue:[ |
726 compiler codeReturn: 'failure.'. |
733 compiler add: self retvalVar , ' at: ', idx asString, ' put: ',(elementVars at: idx),'.'. |
727 ] |
734 ]. |
728 ] else:[ |
735 ]. |
729 node returnParsedObjectsAsCollection ifTrue:[ |
|
730 compiler add: self retvalVar , ' at: ', index asString, ' put: ', childValueVar, '.'. |
|
731 ]. |
|
732 (index < node children size) ifTrue:[ |
|
733 coding value: index + 1. |
|
734 ]. |
|
735 ] |
|
736 |
|
737 ] ifTrue:[ |
|
738 node returnParsedObjectsAsCollection ifTrue:[ |
|
739 compiler add: self retvalVar , ' at: ', index asString, ' put: ', childValueVar, '.'. |
|
740 ]. |
|
741 (index < node children size) ifTrue:[ |
|
742 coding value: index + 1. |
|
743 ]. |
|
744 ] |
|
745 ]. |
|
746 |
|
747 coding value:1. |
|
748 |
736 compiler codeReturn |
749 compiler codeReturn |
737 |
750 |
738 "Modified: / 04-06-2015 / 23:47:52 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
751 "Modified (comment): / 16-06-2015 / 06:38:02 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
739 ! |
752 ! |
740 |
753 |
741 visitStarAnyNode: node |
754 visitStarAnyNode: node |
742 | retvalVar sizeVar | |
755 | retvalVar sizeVar | |
743 |
756 |