compiler/PPCConfiguration.st
changeset 452 9f4558b3be66
parent 438 20598d7ce9fa
child 464 f6d77fee9811
--- 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
 ! !