--- a/compiler/PPCConfiguration.st Thu Apr 30 23:43:14 2015 +0200
+++ b/compiler/PPCConfiguration.st Sun May 10 06:28:36 2015 +0100
@@ -11,125 +11,226 @@
!PPCConfiguration class methodsFor:'as yet unclassified'!
+LL1
+ ^ PPCLL1Configuration new
+!
+
default
- ^ PPCFirstPrototype new
+ ^ self universal
!
new
- ^ self basicNew
- initialize;
- yourself
+ ^ self basicNew
+ initialize;
+ yourself
+!
+
+universal
+ ^ PPCUniversalConfiguration new
! !
!PPCConfiguration methodsFor:'accessing'!
+arguments
+ arguments isNil ifTrue: [ arguments := self defaultArguments ].
+ ^ arguments
+!
+
arguments: args
- arguments := args
+ arguments := args
+!
+
+defaultArguments
+ ^ PPCArguments default
!
input: whatever
- ir := whatever.
- self remember: #input.
+ ir := whatever.
+ self remember: #input.
!
ir
- ^ ir
+ ^ ir
!
ir: whatever
- ir := whatever
+ ir := whatever
! !
-!PPCConfiguration methodsFor:'as yet unclassified'!
+!PPCConfiguration methodsFor:'caching'!
+
+cacheFirstSet
+ "Creates a PPCNodes from a PPParser"
+ | firstSets |
+ firstSets := ir firstSets.
+ ir allNodesDo: [ :node |
+ node firstSet: (firstSets at: node)
+ ]
+!
+
+cacheFirstSetWithProductions
+ "Creates a PPCNodes from a PPParser"
+ | firstSets |
+ firstSets := ir firstSetsSuchThat: [:e | e name isNil not ].
+ ir allNodesDo: [ :node |
+ node firstSetWithProductions: (firstSets at: node)
+ ]
+!
+
+cacheFirstSetWithTokens
+ "Creates a PPCNodes from a PPParser"
+ | firstSets |
+ firstSets := ir firstSetsSuchThat: [:e | e isTerminal or: [ e isTokenNode ] ].
+ ir allNodesDo: [ :node |
+ node firstSetWithTokens: (firstSets at: node)
+ ]
+!
+
+cacheFollowSet
+ "Creates a PPCNodes from a PPParser"
+ | followSets |
+ followSets := ir followSets.
+ ir allNodesDo: [ :node |
+ node followSet: (followSets at: node)
+ ]
+!
+
+cacheFollowSetWithTokens
+ "Creates a PPCNodes from a PPParser"
+ | followSets |
+ followSets := ir firstSetsSuchThat: [:e | e isTerminal or: [ e isTokenNode ] ].
+ ir allNodesDo: [ :node |
+ node followSetWithTokens: (followSets at: node)
+ ]
+! !
+
+!PPCConfiguration methodsFor:'compiling'!
compile: whatever
- self input: whatever.
- self invokePhases.
- ^ ir
+ self input: whatever.
+ self invokePhases.
+ ^ ir
!
-compile: whatever arguments: args
- self arguments: args.
- ^ self compile: whatever.
+invokePhases
+ self subclassResponsibility
+! !
+
+!PPCConfiguration methodsFor:'debugging'!
+
+copy: somethingTransformable
+ ^ somethingTransformable transform: [ :e | e copy ]
!
remember: key
- arguments debug ifTrue: [
- history add: key -> (ir copy).
- ]
+ self arguments debug ifTrue: [
+ history add: key -> (self copy: ir).
+ ]
+! !
+
+!PPCConfiguration methodsFor:'hooks'!
+
+codeCompilerOn: args
+ ^ PPCCompiler on: args
+!
+
+codeGeneratorVisitorOn: compiler
+ ^ arguments codeGenerator on: compiler
! !
!PPCConfiguration methodsFor:'initialization'!
initialize
- history := OrderedCollection new
+ history := OrderedCollection new
! !
!PPCConfiguration methodsFor:'phases'!
+cacheFirstFollow
+ arguments cacheFirstFollow ifFalse: [ ^ self ] .
+
+ self cacheFirstSet.
+ self cacheFollowSet.
+ self cacheFirstSetWithTokens.
+ self cacheFollowSetWithTokens.
+!
+
check
- ir checkTree
+ ir checkTree
+!
+
+createRecognizingComponents
+ arguments recognizingComponents ifFalse: [ ^ self ] .
+
+ ir := PPCRecognizerComponentDetector new
+ arguments: arguments;
+ visit: ir.
+ self remember: #recognizingComponents
+!
+
+createTokens
+ arguments detectTokens ifFalse: [ ^ self ] .
+
+ ir := PPCTokenDetector new
+ arguments: arguments;
+ visit: ir.
+ self remember: #createTokens
!
generate
- | compiler rootMethod compiledParser |
- arguments generate ifFalse: [ ^ self ].
-
- compiler := PPCCompiler on: arguments.
-
- rootMethod := (PPCCodeGenerator on: compiler)
- arguments: arguments;
- visit: ir.
-
- compiler compileParser.
- compiler compiledParser startSymbol: rootMethod methodName.
- compiledParser := compiler compiledParser new.
-
- ir := compiledParser.
+ | compiler rootMethod compiledParser |
+ arguments generate ifFalse: [ ^ self ].
+
+ compiler := self codeCompilerOn: arguments.
+
+ rootMethod := (self codeGeneratorVisitorOn: compiler)
+ arguments: arguments;
+ visit: ir.
+
+ compiler compileParser.
+ compiler compiledParser startSymbol: rootMethod methodName.
+ compiledParser := compiler compiledParser new.
+
+ ir := compiledParser.
!
inline
- arguments inline ifFalse: [ ^ self ].
-
- ir := PPCInliningVisitor new
- arguments: arguments;
- visit: ir.
- self remember: #inline.
+ arguments inline ifFalse: [ ^ self ].
+
+ ir := PPCInliningVisitor new
+ arguments: arguments;
+ visit: ir.
+ self remember: #inline.
!
merge
- arguments merge ifFalse: [ ^ self ].
-
- ir := PPCMergingVisitor new
- arguments: arguments;
- visit: ir.
- self remember: #merge
+ "Merge equivalent nodes under one object with single identity"
+ arguments merge ifFalse: [ ^ self ].
+
+ ir := PPCMergingVisitor new
+ arguments: arguments;
+ visit: ir.
+ self remember: #merge
!
specialize
- arguments specialize ifFalse: [ ^ self ].
+ arguments specialize ifFalse: [ ^ self ].
- "
- Invokes a visitor that creates specialized nodes
- for some patterns of PPCNodes
- "
- ir := (PPCOptimizingVisitor new
- arguments: arguments;
- visit: ir).
- self remember: #specialize
+ "
+ Invokes a visitor that creates specialized nodes
+ for some patterns of PPCNodes,
+
+ e.g. $a astar can be represented by PPCCharacterStarNode
+ "
+ ir := (PPCSpecializingVisitor new
+ arguments: arguments;
+ visit: ir).
+ self remember: #specialize
!
toPPCIr
- ir := ir asCompilerTree.
- self remember: #ppcNodes
-!
-
-tokenize
- arguments tokenize ifFalse: [ ^ self ] .
-
- ir := PPCTokenDetector new
- arguments: arguments;
- visit: ir.
- self remember: #tokenize
+ "Creates a PPCNodes from a PPParser"
+ ir := ir asCompilerTree.
+ self remember: #ppcNodes
! !