--- 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!