--- a/compiler/PPCCodeGenerator.st Tue Aug 18 22:46:10 2015 +0100
+++ b/compiler/PPCCodeGenerator.st Mon Aug 24 15:56:20 2015 +0100
@@ -3,10 +3,10 @@
"{ NameSpace: Smalltalk }"
PPCNodeVisitor subclass:#PPCCodeGenerator
- instanceVariableNames:'compiler'
+ instanceVariableNames:'codeGen'
classVariableNames:''
poolDictionaries:''
- category:'PetitCompiler-Visitors'
+ category:'PetitCompiler-Visitors-CodeGenerators'
!
!PPCCodeGenerator class methodsFor:'as yet unclassified'!
@@ -25,8 +25,21 @@
!PPCCodeGenerator methodsFor:'accessing'!
-compiler: aPPCCompiler
- compiler := aPPCCompiler
+arguments: args
+ super arguments: args.
+ codeGen arguments: args.
+!
+
+clazz: aPPCClass
+ codeGen clazz: aPPCClass
+!
+
+codeGen
+ ^ codeGen
+!
+
+codeGen: anObject
+ codeGen := anObject
!
guards
@@ -42,36 +55,36 @@
children := choiceNode children.
useGuards ifTrue:[
self addGuard: (children at: choiceChildNodeIndex) ifTrue: [
- compiler add: 'self clearError.'.
- compiler
- codeAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
+ codeGen codeClearError.
+ codeGen
+ codeEvaluateAndAssign:[ self visit:(children at: choiceChildNodeIndex) ]
to: resultVar.
- compiler add: 'error ifFalse: [ '.
- compiler codeReturn: resultVar.
- compiler add: ' ].'.
+ codeGen codeIf: 'error' then: nil else: [
+ codeGen codeReturn: resultVar.
+ ].
] ifFalse:[
- compiler add: 'error := true.'.
+ codeGen code: 'error := true.'.
].
- compiler add: 'error ifTrue:[ '.
- choiceChildNodeIndex < children size ifTrue:[
- self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
- ] ifFalse:[
- compiler codeError: 'no choice suitable'.
+ codeGen codeIf: 'error' then: [
+ choiceChildNodeIndex < children size ifTrue:[
+ self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
+ ] ifFalse:[
+ codeGen codeError: 'no choice suitable'.
+ ].
].
- compiler addOnLine: '].'.
] ifFalse:[
choiceChildNodeIndex <= children size ifTrue:[
- compiler add: 'self clearError.'.
- compiler
- codeAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
+ codeGen codeClearError.
+ codeGen
+ codeEvaluateAndAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
to: resultVar.
- compiler add: 'error ifFalse: [ '.
- compiler codeReturn: resultVar.
- compiler add: ' ].'.
+ codeGen codeIf: 'error' then: nil else: [
+ codeGen codeReturn: resultVar.
+ ].
self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
] ifFalse:[
- compiler codeError: 'no choice suitable'.
+ codeGen codeError: 'no choice suitable'.
].
].
@@ -83,21 +96,21 @@
child := sequenceNode children at: sequenceNodeChildIndex.
childValueVar := elementVars at: sequenceNodeChildIndex.
- compiler codeAssignParsedValueOf: [ self visit:child ]
+ codeGen codeEvaluateAndAssign: [ self visit:child ]
to: childValueVar.
child acceptsEpsilon ifFalse: [
- compiler codeIfErrorThen: [
+ codeGen codeIfErrorThen: [
"Handle error in the first element in a special way,
because one does not need to do backtracking if the first element fails."
(sequenceNodeChildIndex == 1) ifTrue: [
- compiler codeReturn: 'failure'
+ codeGen codeReturn: 'failure'
] ifFalse: [
- compiler smartRestore: sequenceNode from: mementoVar.
- compiler codeReturn: 'failure.'.
+ codeGen restore: sequenceNode from: mementoVar.
+ codeGen codeReturn: 'failure.'.
]
] else:[
sequenceNode returnParsedObjectsAsCollection ifTrue:[
- compiler add: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
+ codeGen code: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
].
(sequenceNodeChildIndex < sequenceNode children size) ifTrue:[
self generateSequenceChildOf: sequenceNode atIndex: sequenceNodeChildIndex + 1 useMememntoVar: mementoVar storeResultInto: elementVars.
@@ -106,7 +119,7 @@
] ifTrue:[
sequenceNode returnParsedObjectsAsCollection ifTrue:[
- compiler add: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
+ codeGen code: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
].
(sequenceNodeChildIndex < sequenceNode children size) ifTrue:[
self generateSequenceChildOf: sequenceNode atIndex: sequenceNodeChildIndex + 1 useMememntoVar: mementoVar storeResultInto: elementVars.
@@ -115,59 +128,6 @@
]
! !
-!PPCCodeGenerator methodsFor:'guards'!
-
-addGuard: node ifTrue: trueBlock ifFalse: falseBlock
- | guard id |
- (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
- id := compiler idFor: node.
-
-" falseBlock isNil ifFalse: [
- compiler add: 'context atEnd'.
- compiler addOnLine: ' ifTrue: ['.
- compiler indent.
- falseBlock value.
- compiler dedent.
- compiler addOnLine: '].'.
- ]."
-
- guard id: (compiler idFor: guard defaultName: #guard).
- guard compileGuard: compiler.
-
- trueBlock isNil ifFalse: [
- compiler addOnLine: ' ifTrue: ['.
- compiler indent.
- trueBlock value.
- compiler dedent.
- falseBlock isNil ifTrue: [ compiler addOnLine: '].' ]
- ifFalse: [ compiler add: ']'. ]
- ].
- falseBlock isNil ifFalse: [
- compiler addOnLine: ' ifFalse: ['.
- compiler indent.
- falseBlock value.
- compiler dedent.
- compiler addOnLine: '].'.
- ].
- ^ true
-!
-
-addGuardTrimming: node
- | guard firsts id |
- (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
-
- id := compiler idFor: node.
- firsts := node firstSetWithTokens.
-
-
- (firsts allSatisfy: [ :e | e isTrimmingTokenNode ]) ifTrue: [
- "If we start with trimming, we should invoke the whitespace parser"
- self compileTokenWhitespace: firsts anyOne.
- ^ true
- ].
- ^ false
-! !
-
!PPCCodeGenerator methodsFor:'hooks'!
afterAccept: node retval: retval
@@ -186,7 +146,7 @@
!
openDetected: node
- ^ compiler checkCache: (compiler idFor: node)
+ ^ codeGen cachedMethod: (codeGen idFor: node)
! !
!PPCCodeGenerator methodsFor:'private'!
@@ -230,14 +190,14 @@
method isNil ifTrue:[
PPCCompilationError new signalWith: 'oops, no method found (internal error)!!'.
].
- source := method source.
+ source := method sourceCode.
source isNil ifTrue:[
PPCCompilationError new signalWith: 'unavailable source for method ', method printString ,'!!'.
].
"Following actually copies the method to the target class,
though the APU is not nice. This has to be cleaned up"
- (compiler cachedValue: node selector) isNil ifTrue:[
- compiler cache: node selector as: (PPCMethod new id: node selector; source: source; yourself).
+ (codeGen cachedMethod: node selector) isNil ifTrue:[
+ codeGen cacheMethod: (PPCMethod new id: node selector; source: source; yourself) as: node selector.
"Now compile self-sends of the just copied method"
self copySelfSentMethodsOf: method parseTree inClass: aClass
].
@@ -249,67 +209,65 @@
!PPCCodeGenerator methodsFor:'support'!
compileTokenWhitespace: node
- compiler add: 'context atWs ifFalse: ['.
- compiler indent.
- compiler
- codeAssignParsedValueOf:[ self visit:node whitespace ]
+ codeGen codeIf: 'context atWs' then: nil else: [
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node whitespace ]
to:#whatever.
- compiler add: 'context setWs.'.
- compiler dedent.
- compiler add: '].'.
+ codeGen code: 'context setWs.'.
+ ]
!
notCharSetPredicateBody: node
| classificationId classification |
self error: 'deprecated.'.
classification := node extendClassification: node predicate classification.
- classificationId := (compiler idFor: classification defaultName: #classification).
- compiler addConstant: classification as: classificationId.
+ classificationId := (codeGen idFor: classification defaultName: #classification).
+ codeGen addConstant: classification as: classificationId.
- compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
- compiler indent.
- compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
- compiler add: ' ifFalse: [ nil ].'.
- compiler dedent.
+ codeGen addOnLine: '(', classificationId, ' at: context peek asInteger)'.
+ codeGen indent.
+ codeGen add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
+ codeGen add: ' ifFalse: [ nil ].'.
+ codeGen dedent.
!
notMessagePredicateBody: node
self error: 'deprecated'.
- compiler addOnLine: '(context peek ', node message, ')'.
- compiler indent.
- compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
- compiler add: ' ifFalse: [ nil ].'.
- compiler dedent.
+ codeGen addOnLine: '(context peek ', node message, ')'.
+ codeGen indent.
+ codeGen add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
+ codeGen add: ' ifFalse: [ nil ].'.
+ codeGen dedent.
!
predicateBody: node
| tmpId |
self error:'deprecated'.
- tmpId := (compiler idFor: node predicate prefixed: #predicate).
- compiler addConstant: node predicate as: tmpId.
+ tmpId := (codeGen idFor: node predicate prefixed: #predicate).
+ codeGen addConstant: node predicate as: tmpId.
- compiler addOnLine: '(context atEnd not and: [ ', tmpId , ' value: context uncheckedPeek])'.
- compiler indent.
- compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'.
- compiler add: 'ifTrue: [ context next ].'.
- compiler dedent.
+ codeGen addOnLine: '(context atEnd not and: [ ', tmpId , ' value: context uncheckedPeek])'.
+ codeGen indent.
+ codeGen add: 'ifFalse: [ self error: ''predicate not found'' ]'.
+ codeGen add: 'ifTrue: [ context next ].'.
+ codeGen dedent.
!
retvalVar
- ^ compiler currentReturnVariable
+ ^ codeGen currentReturnVariable
"Modified: / 15-06-2015 / 18:20:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
startMethodForNode:node
node isMarkedForInline ifTrue:[
- compiler startInline: (compiler idFor: node).
- compiler codeComment: 'BEGIN inlined code of ' , node printString.
- compiler indent.
+ codeGen startInline: (codeGen idFor: node).
+ codeGen codeComment: 'BEGIN inlined code of ' , node printString.
+ codeGen indent.
] ifFalse:[
- compiler startMethod: (compiler idFor: node).
- compiler codeComment: 'GENERATED by ' , node printString.
- compiler allocateReturnVariable.
+ codeGen startMethod: (codeGen idFor: node).
+ codeGen codeComment: 'GENERATED by ' , node printString.
+ codeGen allocateReturnVariable.
].
"Created: / 23-04-2015 / 15:51:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -318,12 +276,12 @@
!
stopMethodForNode:aPPCNode
- ^ aPPCNode isMarkedForInline ifTrue:[
- compiler dedent.
- compiler add: '"END inlined code of ' , aPPCNode printString , '"'.
- compiler stopInline.
+ ^ codeGen currentMethod isInline ifTrue:[
+ codeGen dedent.
+ codeGen code: '"END inlined code of ' , aPPCNode printString , '"'.
+ codeGen stopInline.
] ifFalse:[
- compiler stopMethod
+ codeGen stopMethod
].
"Created: / 23-04-2015 / 15:51:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -337,11 +295,11 @@
!
cachedDetected: node
- ^ compiler checkCache: (compiler idFor: node)
+ ^ codeGen clazz cachedMethod: (codeGen idFor: node)
!
isCached: node
- ^ (compiler checkCache: (compiler idFor: node)) isNil not
+ ^ (codeGen cachedMethod: (codeGen idFor: node)) isNil not
! !
!PPCCodeGenerator methodsFor:'visiting'!
@@ -423,7 +381,7 @@
So if the method is not inline, make last statement a return.
if the method is inline, make it assignment to retvalVar."
blockBody statements notEmpty ifTrue:["Care for empty blocks - [:t | ] !!"
- compiler currentMethod isInline ifTrue:[
+ codeGen currentMethod isInline ifTrue:[
| assignment |
assignment := RBAssignmentNode variable: (RBVariableNode named: self retvalVar) value: blockBody statements last.
@@ -436,11 +394,11 @@
].
].
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:self retvalVar.
- compiler codeIfErrorThen: [
- compiler codeReturn: 'failure'.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:self retvalVar.
+ codeGen codeIfErrorThen: [
+ codeGen codeReturn: 'failure'.
] else: [
- compiler code: blockBody.
+ codeGen code: blockBody.
]
"Modified: / 27-07-2015 / 15:49:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -449,22 +407,22 @@
visitAndNode: node
| mementoVar |
- mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
- compiler smartRemember: node child to: mementoVar.
+ mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+ codeGen remember: node child to: mementoVar.
- compiler
- codeAssignParsedValueOf:[ self visit:node child ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node child ]
to:self retvalVar.
- compiler smartRestore: node child from: mementoVar.
+ codeGen restore: node child from: mementoVar.
- compiler codeReturn.
+ codeGen codeReturn.
"Modified: / 23-04-2015 / 15:59:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitAnyNode: node
- compiler codeReturn: 'context next ifNil: [ error := true. ].'.
+ codeGen codeReturn: 'context next ifNil: [ error := true. ].'.
"Modified: / 23-04-2015 / 20:52:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -473,17 +431,14 @@
| classification classificationId |
classification := node extendClassification: node predicate classification.
- classificationId := compiler idFor: classification defaultName: #classification.
- compiler addConstant: classification as: classificationId.
+ classificationId := codeGen idFor: classification defaultName: #classification.
+ codeGen addConstant: classification as: classificationId.
- compiler add: '(', classificationId, ' at: context peek asInteger)'.
- compiler indent.
- compiler add: 'ifFalse: ['.
- compiler codeError: 'predicate not found'.
- compiler add: '] ifTrue: [ '.
- compiler codeReturn: 'context next'.
- compiler add: '].'.
- compiler dedent.
+ codeGen codeIf: '(', classificationId, ' at: context peek asInteger)' then: [
+ codeGen codeReturn: 'context next'.
+ ] else: [
+ codeGen codeError: 'predicate not found'.
+ ]
!
visitCharacterNode: node
@@ -491,22 +446,15 @@
node character ppcPrintable ifTrue: [
chid := node character storeString
] ifFalse: [
- chid := compiler idFor: node character defaultName: #char.
- compiler addConstant: (Character value: node character asInteger) as: chid .
+ chid := codeGen idFor: node character defaultName: #char.
+ codeGen addConstant: (Character value: node character asInteger) as: chid .
].
- compiler add: '(context peek == ', chid, ')'.
- compiler indent.
- compiler add: 'ifFalse: ['.
- compiler indent.
- compiler codeError: node character asInteger asString, ' expected'.
- compiler dedent.
- compiler add: '] ifTrue: [ '.
- compiler indent.
- compiler codeReturn: 'context next'.
- compiler dedent.
- compiler add: '].'.
- compiler dedent.
+ codeGen codeIf: '(context peek == ', chid, ')' then: [
+ codeGen codeReturn: 'context next'.
+ ] else: [
+ codeGen codeError: node character asInteger asString, ' expected'.
+ ].
!
visitChild: child of: node
@@ -523,7 +471,7 @@
visitChoiceNode: node
| whitespaceConsumed useGuards resultVar |
- resultVar := compiler allocateTemporaryVariableNamed: 'element'.
+ resultVar := codeGen allocateTemporaryVariableNamed: 'element'.
whitespaceConsumed := self addGuardTrimming: node.
useGuards := whitespaceConsumed.
self generateChoiceChildOf: node atIndex: 1 useGuards: useGuards storeResultInto: resultVar
@@ -533,43 +481,41 @@
!
visitEndOfFileNode: node
- compiler codeReturn: 'context atEnd ifTrue: [ #EOF ] ifFalse: [ self error: ''EOF expected!!'' ].'.
+ codeGen codeReturn: 'context atEnd ifTrue: [ #EOF ] ifFalse: [ self error: ''EOF expected!!'' ].'.
!
visitEndOfInputNode: node
- compiler
- codeAssignParsedValueOf:[ self visit:node child ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node child ]
to:self retvalVar.
- compiler codeIf: 'context atEnd'
- then: [ compiler codeReturn ]
- else: [ compiler codeError: 'End of input expected' ].
+ codeGen codeIf: 'context atEnd'
+ then: [ codeGen codeReturn ]
+ else: [ codeGen codeError: 'End of input expected' ].
"Modified: / 26-05-2015 / 19:03:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitForwardNode: node
- compiler
- codeAssignParsedValueOf:[ self visit:node child ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node child ]
to:self retvalVar.
- compiler codeReturn.
+ codeGen codeReturn.
!
visitLiteralNode: node
| positionVar encodedLiteral |
encodedLiteral := node encodeQuotes: node literal.
- positionVar := compiler allocateTemporaryVariableNamed: 'position'.
+ positionVar := codeGen allocateTemporaryVariableNamed: 'position'.
- compiler codeAssign: 'context position.' to: positionVar.
- compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['.
- compiler codeReturn: '#''', encodedLiteral, ''' '.
- compiler add: '] ifFalse: ['.
- compiler indent.
- compiler add: 'context position: ', positionVar, '.'.
- compiler codeError: encodedLiteral, ' expected' at: positionVar.
- compiler dedent.
- compiler add: '].'.
+ codeGen codeAssign: 'context position.' to: positionVar.
+ codeGen codeIf: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''')' then: [
+ codeGen codeReturn: '#''', encodedLiteral, ''' '.
+ ] else: [
+ codeGen code: 'context position: ', positionVar, '.'.
+ codeGen codeError: encodedLiteral, ' expected' at: positionVar.
+ ].
!
visitMappedActionNode: node
@@ -583,7 +529,7 @@
"Block return value is return value of last statement.
So if the method is not inline, make last statement a return.
if the method is inline, make it assignment to retvalVar."
- compiler currentMethod isInline ifTrue:[
+ codeGen currentMethod isInline ifTrue:[
| assignment |
assignment := RBAssignmentNode variable: (RBVariableNode named: self retvalVar) value: blockBody statements last.
@@ -616,22 +562,22 @@
].
].
- compiler codeAssignParsedValueOf: [ self visit: child ] to: self retvalVar.
- compiler codeIf: 'error' then: [
- compiler codeReturn: 'failure'.
+ codeGen codeEvaluateAndAssign: [ self visit: child ] to: self retvalVar.
+ codeGen codeIf: 'error' then: [
+ codeGen codeReturn: 'failure'.
] else: [
"If the child is sequence and not inlined, extract
nodes from returned collection into used-to-be block variables"
(child isSequenceNode and:[ child returnParsedObjectsAsCollection ]) ifTrue:[
blockNode arguments withIndexDo:[ :arg :idx |
node child isMarkedForInline ifFalse:[
- compiler allocateTemporaryVariableNamed: arg name.
- compiler codeAssign: (self retvalVar , ' at: ', idx printString) to: arg name.
+ codeGen allocateTemporaryVariableNamed: arg name.
+ codeGen codeAssign: (self retvalVar , ' at: ', idx printString) to: arg name.
].
- compiler addOnLine: '.'; nl.
+ codeGen codeOnLine: '.'; codeNl.
].
].
- compiler code: blockBody.
+ codeGen code: blockBody.
]
"Created: / 02-06-2015 / 17:28:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -639,34 +585,30 @@
!
visitMessagePredicateNode: node
- compiler add: '(context peek ', node message, ') ifFalse: ['.
- compiler codeError: 'predicate not found'.
- compiler add: '] ifTrue: [ '.
- compiler codeReturn: ' context next'.
- compiler add: '].'.
-
+ codeGen codeIf: '(context peek ', node message, ')' then: [
+ codeGen codeReturn: ' context next'.
+ ] else: [
+ codeGen codeError: 'predicate not found'.
+ ]
"Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitNilNode: node
- compiler codeReturn: 'nil.'.
+ codeGen codeReturn: 'nil.'.
!
visitNotCharSetPredicateNode: node
| classificationId classification |
classification := node extendClassification: node predicate classification.
- classificationId := (compiler idFor: classification defaultName: #classification).
- compiler addConstant: classification as: classificationId.
+ classificationId := (codeGen idFor: classification defaultName: #classification).
+ codeGen addConstant: classification as: classificationId.
- compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
- compiler indent.
- compiler add: ' ifTrue: ['.
- compiler codeError: 'predicate not expected'.
- compiler add: '] ifFalse: ['.
- compiler codeReturn: 'nil'.
- compiler add: '].'.
- compiler dedent.
+ codeGen codeIf: '(', classificationId, ' at: context peek asInteger)' then: [
+ codeGen codeError: 'predicate not expected'.
+ ] else: [
+ codeGen codeReturn: 'nil'.
+ ]
!
visitNotCharacterNode: node
@@ -674,22 +616,15 @@
node character ppcPrintable ifTrue: [
chid := node character storeString
] ifFalse: [
- chid := compiler idFor: node character defaultName: #char.
- compiler addConstant: (Character value: node character asInteger) as: chid .
+ chid := codeGen idFor: node character defaultName: #char.
+ codeGen addConstant: (Character value: node character asInteger) as: chid .
].
- compiler add: '(context peek == ', chid, ')'.
- compiler indent.
- compiler add: 'ifTrue: ['.
- compiler indent.
- compiler codeError: node character asInteger asString, ' not expected'.
- compiler dedent.
- compiler add: '] ifFalse: [ '.
- compiler indent.
- compiler codeReturn: 'nil.'.
- compiler dedent.
- compiler add: '].'.
- compiler dedent.
+ codeGen codeIf: '(context peek == ', chid, ')' then: [
+ codeGen codeError: node character asInteger asString, ' not expected'.
+ ] else: [
+ codeGen codeReturn: 'nil.'.
+ ].
!
visitNotLiteralNode: node
@@ -697,113 +632,102 @@
encodedLiteral := node encodeQuotes: node literal.
size := node literal size asString.
- compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'.
- compiler indent.
- compiler add: 'ifTrue: ['.
- compiler codeError: encodedLiteral, ' not expected'.
- compiler add: '] ifFalse: [ '.
- compiler codeReturn: 'nil' .
- compiler add: '].'.
- compiler dedent.
+ codeGen codeIf: '((context peek: ', size, ') =#''', encodedLiteral, ''')' then: [
+ codeGen codeError: encodedLiteral, ' not expected'.
+ ] else: [
+ codeGen codeReturn: 'nil' .
+ ]
!
visitNotMessagePredicateNode: node
- compiler addOnLine: '(context peek ', node message, ')'.
- compiler indent.
- compiler add: ' ifTrue: [ '.
- compiler codeError: 'predicate not expected'.
- compiler add: '] ifFalse: ['.
- compiler codeReturn: 'nil'.
- compiler add: ' ].'.
- compiler dedent.
+ codeGen codeIf: '(context peek ', node message, ')' then: [
+ codeGen codeError: 'predicate not expected'.
+ ] else: [
+ codeGen codeReturn: 'nil'.
+ ]
!
visitNotNode: node
| mementoVar |
- mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
- compiler smartRemember: node child to: mementoVar.
+ mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+ codeGen remember: node child to: mementoVar.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
- compiler smartRestore: node child from: mementoVar.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+ codeGen restore: node child from: mementoVar.
- compiler add: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
+ codeGen code: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
"Modified: / 05-05-2015 / 14:29:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitOptionalNode: node
- compiler
- codeAssignParsedValueOf:[ self visit:node child ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node child ]
to:self retvalVar.
- compiler add: 'error ifTrue: [ '.
- compiler indent.
- compiler add: 'self clearError. '.
- compiler codeAssign: 'nil.' to: self retvalVar.
- compiler dedent.
- compiler add: '].'.
- compiler codeReturn.
+ codeGen codeIf: 'error' then: [
+ codeGen codeClearError.
+ codeGen codeAssign: 'nil.' to: self retvalVar.
+ ].
+ codeGen codeReturn.
!
visitPluggableNode: node
| blockId |
- blockId := compiler idFor: node block defaultName: #pluggableBlock.
+ blockId := codeGen idFor: node block defaultName: #pluggableBlock.
- compiler addConstant: node block as: blockId.
- compiler codeReturn: blockId, ' value: context.'.
+ codeGen addConstant: node block as: blockId.
+ codeGen codeReturn: blockId, ' value: context.'.
!
visitPlusNode: node
| elementVar |
- elementVar := compiler allocateTemporaryVariableNamed: 'element'.
+ elementVar := codeGen allocateTemporaryVariableNamed: 'element'.
" self tokenGuards ifTrue: [
compiler codeTokenGuard: node ifFalse: [ compiler codeError: 'at least one occurence expected' ].
].
"
- compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
+ codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
- compiler add: 'error ifTrue: ['.
- compiler codeError: 'at least one occurence expected'.
- compiler add: '] ifFalse: ['.
- compiler indent.
+ codeGen codeIf: 'error' then: [
+ codeGen codeError: 'at least one occurence expected'.
+ ] else: [
(self retvalVar ~~ #whatever) ifTrue:[
- compiler add: self retvalVar , ' add: ',elementVar , '.'.
+ codeGen code: self retvalVar , ' add: ',elementVar , '.'.
].
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
- compiler add: '[ error ] whileFalse: ['.
- compiler indent.
+ codeGen codeEvaluateAndAssignParsedValueOf:[ self visit:node child ] to:elementVar.
+ codeGen code: '[ error ] whileFalse: ['.
+ codeGen indent.
(self retvalVar ~~ #whatever) ifTrue:[
- compiler add: self retvalVar , ' add: ',elementVar , '.'.
+ codeGen code: self retvalVar , ' add: ',elementVar , '.'.
].
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
- compiler dedent.
- compiler add: '].'.
- compiler add: 'self clearError.'.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+ codeGen dedent.
+ codeGen code: '].'.
+ codeGen code: 'self clearError.'.
+
(self retvalVar ~~ #whatever) ifTrue:[
- compiler codeReturn: self retvalVar , ' asArray.'.
+ codeGen codeReturn: self retvalVar , ' asArray.'.
].
- compiler dedent.
- compiler add: '].'.
-
+ ].
"Modified: / 26-05-2015 / 19:04:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitPredicateNode: node
| pid |
- pid := (compiler idFor: node predicate defaultName: #predicate).
+ pid := (codeGen idFor: node predicate defaultName: #predicate).
- compiler addConstant: node predicate as: pid.
+ codeGen addConstant: node predicate as: pid.
- compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'.
- compiler indent.
- compiler add: 'ifFalse: ['.
- compiler codeError: 'predicate not found'.
- compiler add: '] ifTrue: [ ', self retvalVar ,' := context next ].'.
- compiler dedent.
- compiler codeReturn.
+ codeGen codeIf: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])' then: [
+ codeGen code: self retvalVar ,' := context next.'.
+ ] else: [
+ codeGen codeError: 'predicate not found'.
+ ].
+ codeGen codeReturn.
"Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -814,26 +738,24 @@
canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
canBacktrack ifTrue: [
- mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
- compiler smartRemember: node to: mementoVar.
+ mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+ codeGen remember: node to: mementoVar.
].
- compiler
- codeAssignParsedValueOf:[ self visit:(node children at:1) ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:(node children at:1) ]
to:#whatever.
- compiler add: 'error ifTrue: [ ^ failure ].'.
+ codeGen code: 'error ifTrue: [ ^ failure ].'.
2 to: (node children size) do: [ :idx | |child|
child := node children at: idx.
- compiler codeAssignParsedValueOf:[ self visit:child ] to:#whatever.
+ codeGen codeEvaluateAndAssignParsedValueOf:[ self visit:child ] to:#whatever.
child acceptsEpsilon ifFalse: [
- compiler add: 'error ifTrue: [ '.
- compiler indent.
- compiler smartRestore: node from: mementoVar.
- compiler add: ' ^ failure .'.
- compiler dedent.
- compiler add: '].'.
+ codeGen codeIf: 'error' then: [
+ codeGen restore: node from: mementoVar.
+ codeGen code: ' ^ failure .'.
+ ]
].
].
!
@@ -844,7 +766,7 @@
elementVars := node preferredChildrenVariableNames.
elementVars do:[:e |
- compiler allocateTemporaryVariableNamed: e.
+ codeGen allocateTemporaryVariableNamed: e.
].
canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
@@ -853,15 +775,15 @@
self addGuard: node ifTrue: nil ifFalse: [ compiler addOnLine: ' ^ self error' ].
"
canBacktrack ifTrue: [
- mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
- compiler smartRemember: node to: mementoVar.
+ mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+ codeGen remember: node to: mementoVar.
].
node returnParsedObjectsAsCollection ifTrue:[
- compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
+ codeGen codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
].
self generateSequenceChildOf: node atIndex: 1 useMememntoVar: mementoVar storeResultInto: elementVars.
- compiler codeReturn
+ codeGen codeReturn
"Modified (comment): / 16-06-2015 / 06:38:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -870,11 +792,11 @@
| retvalVar sizeVar |
retvalVar := self retvalVar.
- sizeVar := compiler allocateTemporaryVariableNamed: 'size'.
- compiler add: sizeVar , ' := context size - context position.'.
- compiler add: retvalVar,' := Array new: ',sizeVar,'.'.
- compiler add: '(1 to: ',sizeVar,') do: [ :e | ',retvalVar,' at: e put: context next ].'.
- compiler codeReturn.
+ sizeVar := codeGen allocateTemporaryVariableNamed: 'size'.
+ codeGen code: sizeVar , ' := context size - context position.'.
+ codeGen code: retvalVar,' := Array new: ',sizeVar,'.'.
+ codeGen code: '(1 to: ',sizeVar,') do: [ :e | ',retvalVar,' at: e put: context next ].'.
+ codeGen codeReturn.
"Modified: / 15-06-2015 / 18:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
@@ -884,67 +806,63 @@
classification := node extendClassification: node predicate classification.
- classificationId := compiler idFor: classification defaultName: #classification.
- compiler addConstant: classification as: classificationId.
+ classificationId := codeGen idFor: classification defaultName: #classification.
+ codeGen addConstant: classification as: classificationId.
- compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
- compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
- compiler indent.
- compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
- compiler dedent.
- compiler add: '].'.
- compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
- compiler codeReturn.
+ codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
+ codeGen code: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
+ codeGen indent.
+ codeGen codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
+ codeGen dedent.
+ codeGen code: '].'.
+ codeGen codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
+ codeGen codeReturn.
!
visitStarMessagePredicateNode: node
- compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
- compiler add: '[ context peek ', node message, ' ] whileTrue: ['.
- compiler indent.
- compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
- compiler dedent.
- compiler add: '].'.
- compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
- compiler codeReturn.
+ codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
+ codeGen code: '[ context peek ', node message, ' ] whileTrue: ['.
+ codeGen indent.
+ codeGen codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
+ codeGen dedent.
+ codeGen code: '].'.
+ codeGen codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
+ codeGen codeReturn.
!
visitStarNode: node
| elementVar |
- elementVar := compiler allocateTemporaryVariableNamed: 'element'.
+ elementVar := codeGen allocateTemporaryVariableNamed: 'element'.
+ codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
- self addGuard: node child ifTrue: nil ifFalse: [ compiler codeReturn: '#()' ].
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+ codeGen codeIf: 'error' then: [
+ codeGen codeClearError.
+ codeGen codeReturn: self retvalVar, ' asArray.'.
+ ].
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
- compiler codeIf: 'error'
- then: [
- compiler codeClearError.
- compiler codeReturn: '#()'.
- ] else: [
- compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
- ].
-
- compiler add: '[ error ] whileFalse: ['.
- compiler indent.
- compiler add: self retvalVar, ' add: ', elementVar, '.'.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
- compiler dedent.
- compiler add: '].'.
- compiler codeClearError.
- compiler codeReturn: self retvalVar, ' asArray.'.
+ codeGen code: '[ error ] whileFalse: ['.
+ codeGen indent.
+ codeGen code: self retvalVar, ' add: ', elementVar, '.'.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+ codeGen dedent.
+ codeGen code: '].'.
+ codeGen codeClearError.
+ codeGen codeReturn: self retvalVar, ' asArray.'.
!
visitSymbolActionNode: node
| elementVar |
- elementVar := compiler allocateTemporaryVariableNamed: 'element'.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
- compiler add: 'error ifFalse: [ '.
- compiler codeReturn: elementVar, ' ', node block asString, '.'.
- compiler add: '] ifTrue: ['.
- compiler codeReturn: 'failure'.
- compiler add: ']'.
+ elementVar := codeGen allocateTemporaryVariableNamed: 'element'.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+ codeGen codeIf: 'error' then: [
+ codeGen codeReturn: 'failure'
+ ] else: [
+ codeGen codeReturn: elementVar, ' ', node block asString, '.'.
+ ]
!
visitTokenActionNode: node
@@ -954,75 +872,68 @@
the input value.
"
- compiler add: '^ '.
- compiler callOnLine: (node child compileWith: compiler).
+ codeGen add: '^ '.
+ codeGen callOnLine: (node child compileWith: codeGen).
!
visitTokenNode: node
| startVar endVar |
- startVar := compiler allocateTemporaryVariableNamed: 'start'.
- endVar := compiler allocateTemporaryVariableNamed: 'end'.
+ startVar := codeGen allocateTemporaryVariableNamed: 'start'.
+ endVar := codeGen allocateTemporaryVariableNamed: 'end'.
- compiler profileTokenRead: (compiler idFor: node).
+ codeGen profileTokenRead: (codeGen idFor: node).
- compiler codeAssign: 'context position + 1.' to: startVar.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
- compiler add: 'error ifFalse: [ '.
- compiler indent.
- compiler codeAssign: 'context position.' to: endVar.
-
- compiler codeReturn: node tokenClass asString, ' on: (context collection)
- start: ', startVar, '
- stop: ', endVar, '
- value: nil.'.
- compiler dedent.
- compiler add: '].'.
+ codeGen codeAssign: 'context position + 1.' to: startVar.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+ codeGen codeIf: 'error' then: nil else: [
+ codeGen codeAssign: 'context position.' to: endVar.
+ codeGen codeReturn: node tokenClass asString, ' on: (context collection)
+ start: ', startVar, '
+ stop: ', endVar, '
+ value: nil.'.
+ ]
!
visitTokenStarMessagePredicateNode: node
- compiler add: '[ context peek ', node message,' ] whileTrue: ['.
- compiler indent.
- compiler add: 'context next'.
- compiler indent.
- compiler dedent.
- compiler add: '].'.
+ codeGen code: '[ context peek ', node message,' ] whileTrue: ['.
+ codeGen indent.
+ codeGen code: 'context next'.
+ codeGen indent.
+ codeGen dedent.
+ codeGen code: '].'.
!
visitTokenStarSeparatorNode: node
- compiler add: 'context skipSeparators.'.
+ codeGen code: 'context skipSeparators.'.
!
visitTokenWhitespaceNode: node
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
- compiler codeReturn.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+ codeGen codeReturn.
!
visitTrimNode: node
| mementoVar |
"TODO: This ignores the TrimmingParser trimmer object!!"
- mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
+ mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
- compiler smartRemember: node child to: mementoVar.
- compiler add: 'context skipSeparators.'.
+ codeGen remember: node child to: mementoVar.
+ codeGen code: 'context skipSeparators.'.
- compiler
- codeAssignParsedValueOf:[ self visit:node child ]
+ codeGen
+ codeEvaluateAndAssign:[ self visit:node child ]
to:self retvalVar.
- compiler add: 'error ifTrue: [ '.
- compiler indent.
- compiler smartRestore: node child from: mementoVar.
- compiler codeReturn.
- compiler dedent.
- compiler add: '] ifFalse: [' .
- compiler indent.
- compiler add: 'context skipSeparators.'.
- compiler codeReturn.
- compiler dedent.
- compiler add: '].'.
+ codeGen codeIf: 'error' then: [
+ codeGen restore: node child from: mementoVar.
+ codeGen codeReturn.
+ ] else: [
+ codeGen code: 'context skipSeparators.'.
+ codeGen codeReturn.
+ ]
!
visitTrimmingTokenCharacterNode: node
@@ -1032,50 +943,47 @@
visitTrimmingTokenNode: node
| id guard startVar endVar |
- startVar := compiler allocateTemporaryVariableNamed: 'start'.
- endVar := compiler allocateTemporaryVariableNamed: 'end'.
+ startVar := codeGen allocateTemporaryVariableNamed: 'start'.
+ endVar := codeGen allocateTemporaryVariableNamed: 'end'.
- id := compiler idFor: node.
- compiler profileTokenRead: id.
+ id := codeGen idFor: node.
+ codeGen profileTokenRead: id.
self compileTokenWhitespace: node.
(arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [
guard id: id, '_guard'.
- compiler add: 'context atEnd ifTrue: [ self error ].'.
- guard compileGuard: compiler.
- compiler addOnLine: 'ifFalse: [ self error ].'.
- compiler add: 'error ifFalse: ['.
- compiler indent.
+ codeGen code: 'context atEnd ifTrue: [ self error ].'.
+ guard compileGuard: codeGen.
+ codeGen codeOnLine: 'ifFalse: [ self error ].'.
+ codeGen code: 'error ifFalse: ['.
+ codeGen indent.
].
- compiler codeAssign: 'context position + 1.' to: startVar.
- compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
+ codeGen codeAssign: 'context position + 1.' to: startVar.
+ codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
(arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [
- compiler dedent.
- compiler add: '].'.
+ codeGen dedent.
+ codeGen code: '].'.
].
- compiler add: 'error ifFalse: [ '.
- compiler indent.
- compiler codeAssign: 'context position.' to: endVar.
-
-" self compileSecondWhitespace: compiler."
- self compileTokenWhitespace: node.
+ codeGen codeIf: 'error' then: nil else: [
+ codeGen codeAssign: 'context position.' to: endVar.
+ " self compileSecondWhitespace: compiler."
+ self compileTokenWhitespace: node.
- compiler codeReturn: node tokenClass asString, ' on: (context collection)
- start: ', startVar, '
- stop: ', endVar, '
- value: nil'.
- compiler dedent.
- compiler add: '].'
+ codeGen codeReturn: node tokenClass asString, ' on: (context collection)
+ start: ', startVar, '
+ stop: ', endVar, '
+ value: nil'.
+ ]
!
visitUnknownNode: node
| compiledChild compiledParser id |
- id := compiler idFor: node.
+ id := codeGen idFor: node.
compiledParser := node parser copy.
"Compile all the children and call compiled version of them instead of the original one"
@@ -1084,15 +992,14 @@
compiledParser replace: child with: compiledChild bridge.
].
- compiler addConstant: compiledParser as: id.
+ codeGen addConstant: compiledParser as: id.
- compiler codeClearError.
- compiler add: '(', self retvalVar, ' := ', id, ' parseOn: context) isPetitFailure'.
- compiler indent.
- compiler add: ' ifTrue: [self error: ', self retvalVar, ' message at: ', self retvalVar, ' position ].'.
- compiler dedent.
- compiler add: 'error := ', self retvalVar, ' isPetitFailure.'.
- compiler codeReturn.
+ codeGen codeClearError.
+ codeGen codeIf: '(', self retvalVar, ' := ', id, ' parseOn: context) isPetitFailure' then: [
+ codeGen codeError: 'self error: ', self retvalVar at: self retvalVar, ' position .'.
+ ].
+ codeGen code: 'error := ', self retvalVar, ' isPetitFailure.'.
+ codeGen codeReturn.
"Modified: / 15-06-2015 / 17:59:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !