diff -r 1e45d3c96ec5 -r b5316ef15274 compiler/FooScanner.st --- 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!