--- 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
--- a/compiler/PPCCompiler.st Tue May 26 07:27:15 2015 +0100
+++ b/compiler/PPCCompiler.st Wed May 27 03:30:35 2015 +0100
@@ -117,8 +117,16 @@
currentMethod add: '"', string, '"'.
!
-addConstant: value as: name
+addConstant: value as: name
+ (constants includesKey: name) ifTrue:[
+ (constants at: name) ~~ value ifTrue:[
+ self error:'Duplicate constant!!'.
+ ].
+ ^ self.
+ ].
constants at: name put: value
+
+ "Modified: / 26-05-2015 / 17:07:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
addOnLine: string
@@ -527,7 +535,7 @@
self initialize.
compilerStack := Stack new.
cache := IdentityDictionary new.
- constants := IdentityDictionary new.
+ constants := Dictionary new.
ids := IdentityDictionary new.
@@ -550,6 +558,8 @@
Transcript cr; show: 'intialized for: ', aString; cr.
+
+ "Modified: / 26-05-2015 / 17:09:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!PPCCompiler class methodsFor:'documentation'!