compiler/FooScanner.st
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
equal deleted inserted replaced
502:1e45d3c96ec5 515:b5316ef15274
     2 
     2 
     3 "{ NameSpace: Smalltalk }"
     3 "{ NameSpace: Smalltalk }"
     4 
     4 
     5 PPCScanner subclass:#FooScanner
     5 PPCScanner subclass:#FooScanner
     6 	instanceVariableNames:''
     6 	instanceVariableNames:''
     7 	classVariableNames:''
     7 	classVariableNames:'MaxSymbolNumber Tokens'
     8 	poolDictionaries:''
     8 	poolDictionaries:''
     9 	category:'PetitCompiler-Scanner'
     9 	category:'PetitCompiler-Scanner'
    10 !
    10 !
    11 
    11 
    12 !FooScanner methodsFor:'as yet unclassified'!
    12 !FooScanner class methodsFor:'as yet unclassified'!
       
    13 
       
    14 initialize
       
    15     super initialize.
       
    16     
       
    17     MaxSymbolNumber := 3.
       
    18     Tokens := #(#A1 #A2 #B).
       
    19 ! !
       
    20 
       
    21 !FooScanner methodsFor:'distinct'!
    13 
    22 
    14 nextTokenA
    23 nextTokenA
    15     "a"
    24     "a"
       
    25     self resetDistinct.
       
    26     
    16     self step.
    27     self step.
    17     self peek == $a ifFalse: [ ^ self return ].
    28     self peek == $a ifFalse: [ ^ self return ].
    18 
    29 
    19     self recordMatch: #a.
    30     self recordDistinctMatch: #a.
    20 
    31 
    21     ^ self return
    32     ^ self returnDistinct
    22 !
    33 !
    23 
    34 
    24 nextTokenAAorA
    35 nextTokenAAorA
    25     "aa / a"
    36     "aa / a"
    26     self step.
    37     self resetDistinct.
    27     (self peek == $a) ifFalse: [ ^ self return ].
    38     
    28     self recordMatch: #a priority: -1.	
    39     self step.
    29 
    40     (self peek == $a) ifFalse: [ ^ self returnDistinct ].
    30     self step.
    41     self recordDistinctMatch: #a.	
    31     (self peek == $a) ifFalse: [ ^ self return ].
    42 
    32     self recordMatch: #aa priority: 0.	
    43     self step.
    33 
    44     (self peek == $a) ifFalse: [ ^ self returnDistinct ].
    34     ^ self return.
    45     self recordDistinctMatch: #aa.	
       
    46 
       
    47     ^ self returnDistinct.
    35 !
    48 !
    36 
    49 
    37 nextTokenAAplusA
    50 nextTokenAAplusA
    38     "(aa)+a"
    51     "(aa)+a"
    39     self step.
    52     self resetDistinct.
    40     self peek == $a ifFalse: [ ^ self return ].
    53     
    41 
    54     self step.
    42     self step.
    55     self peek == $a ifFalse: [ ^ self returnDistinct ].
    43     self peek == $a ifFalse: [ ^ self return. ].
    56 
    44 
    57     self step.
    45     [ 
    58     self peek == $a ifFalse: [ ^ self returnDistinct. ].
    46         self step.
    59 
    47         self peek == $a ifFalse: [ ^ self returnPriority: 0 ].
    60     [ 
    48         self recordMatch: #AAplusA priority: -1.
    61         self recordDistinctMatch: nil.
    49 
    62 
    50         self step.
    63         self step.
    51         self peek == $a.
    64         self peek == $a ifFalse: [ ^ self returnDistinct ].
    52     ] whileTrue.
    65         self recordDistinctMatch: #AAplusA.
    53 
    66 
    54     ^ self returnPriority: -1
    67         self step.
       
    68         self peek == $a.
       
    69     ] whileTrue.
       
    70 
       
    71     ^ self returnDistinct
    55 !
    72 !
    56 
    73 
    57 nextTokenAAstarA
    74 nextTokenAAstarA
    58     "(aa)*a"
    75     "(aa)*a"
    59     self step.
    76     self resetDistinct.
    60     self peek == $a ifFalse: [ ^ self return ].
    77     
    61 
    78     self step.
    62     [ 
    79     self peek == $a ifFalse: [ ^ self returnDistinct ].
    63         self recordMatch: #AAstarA priority: -1.
    80 
    64 
    81     [ 
    65         self step.
    82         self recordDistinctMatch: #AAstarA.
    66         self peek == $a ifFalse: [ ^ self returnPriority: -1 ].
    83 
    67         self step.
    84         self step.
    68         
    85         self peek == $a ifFalse: [ ^ self returnDistinct ].
       
    86         self recordDistinctMatch: nil.
       
    87 
       
    88         self step.
    69         self peek == $a	
    89         self peek == $a	
    70     ] whileTrue.
    90     ] whileTrue.
    71     
    91     
    72     ^ self returnPriority: 0
    92     ^ self returnDistinct
    73 !
       
    74 
       
    75 nextTokenAB
       
    76     "ab"
       
    77     self step.
       
    78     self peek == $a ifFalse: [ ^ self return ].
       
    79     
       
    80     self step.
       
    81     self peek == $b ifFalse: [ ^ self return ].
       
    82     self recordMatch: #b.
       
    83     
       
    84     ^ self return.
       
    85 !
    93 !
    86 
    94 
    87 nextTokenABorBC
    95 nextTokenABorBC
    88     "a"
    96     "a"
    89     self step.
    97     self resetDistinct.
    90     (self peek == $a) ifTrue: [ 
    98     
    91 
    99     self step.
    92         self step.
   100     (self peek == $a) ifTrue: [ 
    93         self peek == $b ifFalse: [ ^ self return ].
   101 
    94         self recordMatch: #ab.
   102         self step.
    95 
   103         self peek == $b ifFalse: [ ^ self returnDistinct ].
    96         ^ self return	
   104         self recordDistinctMatch: #ab.
       
   105 
       
   106         ^ self returnDistinct
    97     ].
   107     ].
    98 
   108 
    99     (self peek == $b) ifTrue: [ 
   109     (self peek == $b) ifTrue: [ 
   100         self step.
   110         self step.
   101         self peek == $c ifFalse: [ ^ self return ].
   111         self peek == $c ifFalse: [ ^ self returnDistinct ].
   102         self recordMatch: #bc.	
   112         self recordDistinctMatch: #bc.	
   103 
   113 
   104         ^ self return
   114         ^ self returnDistinct
   105     ].
   115     ].
   106 
   116 
   107     ^ self return
   117     ^ self returnDistinct
   108 !
   118 !
   109 
   119 
   110 nextTokenABstarA
   120 nextTokenABstarA
   111     "(ab)*a"
   121     "(ab)*a"
   112     self step.
   122     self resetDistinct.
   113     self peek == $a ifFalse: [ ^ self return ].
   123     
   114 
   124     self step.
   115     [ 
   125     self peek == $a ifFalse: [ ^ self returnDistinct ].
   116         self recordMatch: #ABstarA priority: -1.
   126 
       
   127     [ 
       
   128         self recordDistinctMatch: #ABstarA.
   117         
   129         
   118         self step.
   130         self step.
   119         self peek == $b ifFalse: [ ^ self returnPriority: -1 ].
   131         self peek == $b ifFalse: [ ^ self returnDistinct ].
   120     
   132         self recordDistinctMatch: nil.
   121         self step.
   133     
   122         self peek == $a.
   134         self step.
   123     ] whileTrue.
   135         self peek == $a.
   124 
   136     ] whileTrue.
   125     ^ self returnPriority: 0
   137 
       
   138     ^ self returnDistinct
   126 !
   139 !
   127 
   140 
   128 nextTokenA_Bstar_A
   141 nextTokenA_Bstar_A
   129     "ab"
   142     "ab"
   130     self step.
   143     self resetDistinct.
   131     self peek == $a ifFalse: [ ^ self return ].
   144     
       
   145     self step.
       
   146     self peek == $a ifFalse: [ ^ self returnDistinct ].
   132 
   147 
   133     [
   148     [
   134         self step.
   149         self step.
   135         self peek == $b.
   150         self peek == $b.
   136     ] whileTrue.
   151     ] whileTrue.
   137 
   152 
   138 
   153 
   139     self peek == $a ifFalse: [ ^ self return ].
   154     self peek == $a ifFalse: [ ^ self returnDistinct ].
   140     self recordMatch: #A_Bstar_A.
   155     self recordDistinctMatch: #A_Bstar_A.
   141 
   156 
   142     ^ self return.
   157     ^ self returnDistinct.
   143 !
   158 !
   144 
   159 
   145 nextTokenAorAA
   160 nextTokenAorAA
   146     "aa / a"
   161     "aa / a"
   147     self step.
   162     self resetDistinct.
   148     (self peek == $a) ifTrue: [ 
   163     
   149         self recordMatch: #a priority: 0.	
   164     self step.
   150         ^ self return
   165     (self peek == $a) ifTrue: [ 
   151     ].
   166         self recordDistinctMatch: #a.	
   152 
   167         ^ self returnDistinct
   153     self step.
   168     ].
   154     (self peek == $a) ifTrue: [ 
   169 
   155         self recordMatch: #aa priority: -1.	
   170     self step.
   156         ^ self return
   171     (self peek == $a) ifTrue: [ 
       
   172         self recordDistinctMatch: #aa.	
       
   173         ^ self returnDistinct
   157     ].
   174     ].
   158 !
   175 !
   159 
   176 
   160 nextTokenAorB
   177 nextTokenAorB
   161     "a"
   178     "a"
   162     self step.
   179     self resetDistinct.
   163     (self peek == $a) ifTrue: [ 
   180     
   164         self recordMatch: #a.	
   181     self step.
   165         ^ self return
   182     (self peek == $a) ifTrue: [ 
       
   183         self recordDistinctMatch: #a.	
       
   184         ^ self returnDistinct
   166     ].
   185     ].
   167     (self peek == $b) ifTrue: [ 
   186     (self peek == $b) ifTrue: [ 
   168         self recordMatch: #b.	
   187         self recordDistinctMatch: #b.	
   169         ^ self return
   188         ^ self returnDistinct
   170     ].
   189     ].
   171 
   190 
   172     ^ self return
   191     ^ self returnDistinct
   173 !
   192 !
   174 
   193 
   175 nextTokenAstarA
   194 nextTokenAstarA
   176     "a*a"
   195     "a*a"
   177     [
   196     [
   178         self step.
   197         self step.
   179         self peek == $a.
   198         self peek == $a.
   180     ] whileTrue.
   199     ] whileTrue.
   181 
   200 
   182     self peek == $a ifFalse: [ ^ self return ].
   201     self peek == $a ifFalse: [ ^ self returnDistinct ].
   183     self recordMatch: #AstarA.
   202     self recordDistinctMatch: #AstarA.
   184     ^ self return
   203     ^ self returnDistinct
   185 !
   204 !
   186 
   205 
   187 nextTokenAstarB
   206 nextTokenAstarB
   188     "a*b"
   207     "a*b"
   189     [ 
   208     self resetDistinct.
   190         self step.
   209     
   191         self peek == $a.
   210     [ 
   192     ] whileTrue.
   211         self step.
   193 
   212         self peek == $a.
   194     self peek == $b ifFalse: [ ^ self return ].
   213     ] whileTrue.
   195     self recordMatch: #AstarB.
   214 
   196     ^ self return
   215     self peek == $b ifFalse: [ ^ self returnDistinct ].
       
   216     self recordDistinctMatch: #AstarB.
       
   217     ^ self returnDistinct
       
   218 ! !
       
   219 
       
   220 !FooScanner methodsFor:'initialization'!
       
   221 
       
   222 initialize
       
   223     super initialize.
       
   224 ! !
       
   225 
       
   226 !FooScanner methodsFor:'mutlivalue'!
       
   227 
       
   228 nextMultiTokenA
       
   229     "a|a"
       
   230     self reset.
       
   231     
       
   232     self step.
       
   233     self peek == $a ifFalse: [ ^ self ].
       
   234     
       
   235     self recordMatch: 1. "A1 in matches"
       
   236     self recordMatch: 2. "A2 in matches"
       
   237 !
       
   238 
       
   239 nextTokenAB
       
   240     "ab"
       
   241     self reset.
       
   242     
       
   243     self step.
       
   244     self peek == $a ifFalse: [ ^ self ].
       
   245     
       
   246     self step.
       
   247     self peek == $b ifFalse: [ ^ self ].
       
   248     self recordMatch: 3. "ID of #B"
       
   249     
       
   250     ^ self
   197 !
   251 !
   198 
   252 
   199 nextTokenAuorA
   253 nextTokenAuorA
   200     "a | a"
   254     "a | a"
   201     self step.
   255     self reset.
   202     (self peek == $a) ifTrue: [ 
   256     
   203         self recordMatch: #a1.	
   257     self step.
   204         self recordMatch: #a2.
   258     (self peek == $a) ifTrue: [ 
   205         ^ self return	
   259         self recordMatch: 1.	
   206     ].
   260         self recordMatch: 2.
   207 
   261         ^ self
   208     ^ self return	
   262     ].
   209 ! !
   263 
   210 
   264     ^ self
       
   265 ! !
       
   266 
       
   267 
       
   268 FooScanner initialize!