compiler/FooScanner.st
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
--- a/compiler/FooScanner.st	Fri Jul 24 15:06:54 2015 +0100
+++ b/compiler/FooScanner.st	Mon Aug 17 12:13:16 2015 +0100
@@ -4,131 +4,146 @@
 
 PPCScanner subclass:#FooScanner
 	instanceVariableNames:''
-	classVariableNames:''
+	classVariableNames:'MaxSymbolNumber Tokens'
 	poolDictionaries:''
 	category:'PetitCompiler-Scanner'
 !
 
-!FooScanner methodsFor:'as yet unclassified'!
+!FooScanner class methodsFor:'as yet unclassified'!
+
+initialize
+    super initialize.
+    
+    MaxSymbolNumber := 3.
+    Tokens := #(#A1 #A2 #B).
+! !
+
+!FooScanner methodsFor:'distinct'!
 
 nextTokenA
     "a"
+    self resetDistinct.
+    
     self step.
     self peek == $a ifFalse: [ ^ self return ].
 
-    self recordMatch: #a.
+    self recordDistinctMatch: #a.
 
-    ^ self return
+    ^ self returnDistinct
 !
 
 nextTokenAAorA
     "aa / a"
+    self resetDistinct.
+    
     self step.
-    (self peek == $a) ifFalse: [ ^ self return ].
-    self recordMatch: #a priority: -1.	
+    (self peek == $a) ifFalse: [ ^ self returnDistinct ].
+    self recordDistinctMatch: #a.	
 
     self step.
-    (self peek == $a) ifFalse: [ ^ self return ].
-    self recordMatch: #aa priority: 0.	
+    (self peek == $a) ifFalse: [ ^ self returnDistinct ].
+    self recordDistinctMatch: #aa.	
 
-    ^ self return.
+    ^ self returnDistinct.
 !
 
 nextTokenAAplusA
     "(aa)+a"
+    self resetDistinct.
+    
     self step.
-    self peek == $a ifFalse: [ ^ self return ].
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
 
     self step.
-    self peek == $a ifFalse: [ ^ self return. ].
+    self peek == $a ifFalse: [ ^ self returnDistinct. ].
 
     [ 
+        self recordDistinctMatch: nil.
+
         self step.
-        self peek == $a ifFalse: [ ^ self returnPriority: 0 ].
-        self recordMatch: #AAplusA priority: -1.
+        self peek == $a ifFalse: [ ^ self returnDistinct ].
+        self recordDistinctMatch: #AAplusA.
 
         self step.
         self peek == $a.
     ] whileTrue.
 
-    ^ self returnPriority: -1
+    ^ self returnDistinct
 !
 
 nextTokenAAstarA
     "(aa)*a"
+    self resetDistinct.
+    
     self step.
-    self peek == $a ifFalse: [ ^ self return ].
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
 
     [ 
-        self recordMatch: #AAstarA priority: -1.
+        self recordDistinctMatch: #AAstarA.
 
         self step.
-        self peek == $a ifFalse: [ ^ self returnPriority: -1 ].
+        self peek == $a ifFalse: [ ^ self returnDistinct ].
+        self recordDistinctMatch: nil.
+
         self step.
-        
         self peek == $a	
     ] whileTrue.
     
-    ^ self returnPriority: 0
-!
-
-nextTokenAB
-    "ab"
-    self step.
-    self peek == $a ifFalse: [ ^ self return ].
-    
-    self step.
-    self peek == $b ifFalse: [ ^ self return ].
-    self recordMatch: #b.
-    
-    ^ self return.
+    ^ self returnDistinct
 !
 
 nextTokenABorBC
     "a"
+    self resetDistinct.
+    
     self step.
     (self peek == $a) ifTrue: [ 
 
         self step.
-        self peek == $b ifFalse: [ ^ self return ].
-        self recordMatch: #ab.
+        self peek == $b ifFalse: [ ^ self returnDistinct ].
+        self recordDistinctMatch: #ab.
 
-        ^ self return	
+        ^ self returnDistinct
     ].
 
     (self peek == $b) ifTrue: [ 
         self step.
-        self peek == $c ifFalse: [ ^ self return ].
-        self recordMatch: #bc.	
+        self peek == $c ifFalse: [ ^ self returnDistinct ].
+        self recordDistinctMatch: #bc.	
 
-        ^ self return
+        ^ self returnDistinct
     ].
 
-    ^ self return
+    ^ self returnDistinct
 !
 
 nextTokenABstarA
     "(ab)*a"
+    self resetDistinct.
+    
     self step.
-    self peek == $a ifFalse: [ ^ self return ].
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
 
     [ 
-        self recordMatch: #ABstarA priority: -1.
+        self recordDistinctMatch: #ABstarA.
         
         self step.
-        self peek == $b ifFalse: [ ^ self returnPriority: -1 ].
+        self peek == $b ifFalse: [ ^ self returnDistinct ].
+        self recordDistinctMatch: nil.
     
         self step.
         self peek == $a.
     ] whileTrue.
 
-    ^ self returnPriority: 0
+    ^ self returnDistinct
 !
 
 nextTokenA_Bstar_A
     "ab"
+    self resetDistinct.
+    
     self step.
-    self peek == $a ifFalse: [ ^ self return ].
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
 
     [
         self step.
@@ -136,40 +151,44 @@
     ] whileTrue.
 
 
-    self peek == $a ifFalse: [ ^ self return ].
-    self recordMatch: #A_Bstar_A.
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
+    self recordDistinctMatch: #A_Bstar_A.
 
-    ^ self return.
+    ^ self returnDistinct.
 !
 
 nextTokenAorAA
     "aa / a"
+    self resetDistinct.
+    
     self step.
     (self peek == $a) ifTrue: [ 
-        self recordMatch: #a priority: 0.	
-        ^ self return
+        self recordDistinctMatch: #a.	
+        ^ self returnDistinct
     ].
 
     self step.
     (self peek == $a) ifTrue: [ 
-        self recordMatch: #aa priority: -1.	
-        ^ self return
+        self recordDistinctMatch: #aa.	
+        ^ self returnDistinct
     ].
 !
 
 nextTokenAorB
     "a"
+    self resetDistinct.
+    
     self step.
     (self peek == $a) ifTrue: [ 
-        self recordMatch: #a.	
-        ^ self return
+        self recordDistinctMatch: #a.	
+        ^ self returnDistinct
     ].
     (self peek == $b) ifTrue: [ 
-        self recordMatch: #b.	
-        ^ self return
+        self recordDistinctMatch: #b.	
+        ^ self returnDistinct
     ].
 
-    ^ self return
+    ^ self returnDistinct
 !
 
 nextTokenAstarA
@@ -179,32 +198,71 @@
         self peek == $a.
     ] whileTrue.
 
-    self peek == $a ifFalse: [ ^ self return ].
-    self recordMatch: #AstarA.
-    ^ self return
+    self peek == $a ifFalse: [ ^ self returnDistinct ].
+    self recordDistinctMatch: #AstarA.
+    ^ self returnDistinct
 !
 
 nextTokenAstarB
     "a*b"
+    self resetDistinct.
+    
     [ 
         self step.
         self peek == $a.
     ] whileTrue.
 
-    self peek == $b ifFalse: [ ^ self return ].
-    self recordMatch: #AstarB.
-    ^ self return
+    self peek == $b ifFalse: [ ^ self returnDistinct ].
+    self recordDistinctMatch: #AstarB.
+    ^ self returnDistinct
+! !
+
+!FooScanner methodsFor:'initialization'!
+
+initialize
+    super initialize.
+! !
+
+!FooScanner methodsFor:'mutlivalue'!
+
+nextMultiTokenA
+    "a|a"
+    self reset.
+    
+    self step.
+    self peek == $a ifFalse: [ ^ self ].
+    
+    self recordMatch: 1. "A1 in matches"
+    self recordMatch: 2. "A2 in matches"
+!
+
+nextTokenAB
+    "ab"
+    self reset.
+    
+    self step.
+    self peek == $a ifFalse: [ ^ self ].
+    
+    self step.
+    self peek == $b ifFalse: [ ^ self ].
+    self recordMatch: 3. "ID of #B"
+    
+    ^ self
 !
 
 nextTokenAuorA
     "a | a"
+    self reset.
+    
     self step.
     (self peek == $a) ifTrue: [ 
-        self recordMatch: #a1.	
-        self recordMatch: #a2.
-        ^ self return	
+        self recordMatch: 1.	
+        self recordMatch: 2.
+        ^ self
     ].
 
-    ^ self return	
+    ^ self
 ! !
 
+
+FooScanner initialize!