compiler/tests/PEGFsaScannerIntegrationTest.st
changeset 502 1e45d3c96ec5
child 515 b5316ef15274
equal deleted inserted replaced
464:f6d77fee9811 502:1e45d3c96ec5
       
     1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 TestCase subclass:#PEGFsaScannerIntegrationTest
       
     6 	instanceVariableNames:'fsa fsaGenerator parser scanner result compiled'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-Scanner'
       
    10 !
       
    11 
       
    12 !PEGFsaScannerIntegrationTest methodsFor:'as yet unclassified'!
       
    13 
       
    14 compile
       
    15     | ppcTree |
       
    16     compiled ifTrue: [ ^ self ].
       
    17     ppcTree := parser asCompilerTree.
       
    18     fsa := ppcTree asFsa.
       
    19     fsa name: #nextToken.
       
    20     fsa finalStates do: [ :s | s isFailure ifFalse: [s retval: #token ]].
       
    21 
       
    22     scanner := ((PPCScannerCodeGenerator new)
       
    23         generate: fsa).
       
    24 
       
    25     compiled := true
       
    26 !
       
    27 
       
    28 failScan: stream
       
    29     self compile.
       
    30 
       
    31     scanner initialize.
       
    32     scanner stream: stream asPetitStream. 
       
    33     result := scanner nextToken.
       
    34         
       
    35     self assert: result isEmpty
       
    36 !
       
    37 
       
    38 scan: stream token: token
       
    39     self scan: stream token: token position: stream size.
       
    40 !
       
    41 
       
    42 scan: stream token: token position: position
       
    43     self compile.
       
    44 
       
    45     scanner initialize.
       
    46     scanner stream: stream asPetitStream. 
       
    47     result := scanner nextToken.
       
    48         
       
    49     self assert: result isCollection description: 'no collection returned as a result!!'.
       
    50     self assert: (result isEmpty not) description: 'no token found'.
       
    51     self assert: (result at: token) = position.
       
    52 !
       
    53 
       
    54 setUp
       
    55     compiled := false.
       
    56     fsaGenerator := PEGFsaGenerator new.
       
    57 !
       
    58 
       
    59 testA
       
    60     parser := 'a' asParser.
       
    61     
       
    62     self compile.
       
    63 
       
    64     self assert: fsa isDeterministic.
       
    65     self assert: fsa isWithoutEpsilons.	
       
    66     
       
    67     self failScan: ''.
       
    68     self failScan: 'b'.
       
    69 
       
    70     self scan: 'a' token: #token position: 1.
       
    71     self scan: 'aaa' token: #token position: 1.
       
    72 !
       
    73 
       
    74 testAAA_Aplusnot
       
    75     parser := 'aaa' asParser not, $a asParser plus.
       
    76     self compile.
       
    77 
       
    78     self assert: fsa isDeterministic.
       
    79     self assert: fsa isWithoutEpsilons.	
       
    80 
       
    81     self scan: 'a' token: #token.
       
    82     self scan: 'aa' token: #token.
       
    83 
       
    84     self failScan: ''.
       
    85     self failScan: 'aaa'.
       
    86     self failScan: 'aaaa'.
       
    87     self failScan: 'aaaaa'.
       
    88 !
       
    89 
       
    90 testAAplus_A
       
    91     parser := 'aa' asParser plus, $a asParser.
       
    92     
       
    93     self scan: 'aaa' token: #token.
       
    94     self scan: 'aaaaa' token: #token.
       
    95 
       
    96     self failScan: 'a'.
       
    97     self failScan: 'aa'.
       
    98     self failScan: 'aaaa'.
       
    99 !
       
   100 
       
   101 testAAplus_B
       
   102     parser := 'aa' asParser plus, $b asParser.
       
   103     
       
   104     self scan: 'aab' token: #token.
       
   105     self scan: 'aaaab' token: #token.
       
   106 
       
   107     self failScan: 'ab'.
       
   108     self failScan: 'aaab'.
       
   109     self failScan: 'aac'.
       
   110 !
       
   111 
       
   112 testAAstar_A
       
   113     parser := 'aa' asParser star, $a asParser.
       
   114     
       
   115     self scan: 'a' token: #token.
       
   116     self scan: 'aaa' token: #token.
       
   117     self scan: 'aaaaa' token: #token.
       
   118     self scan: 'aaaaaaa' token: #token.
       
   119 
       
   120 
       
   121     self failScan: 'aa'.
       
   122     self failScan: 'aaaa'.
       
   123 !
       
   124 
       
   125 testAAstar_B
       
   126     parser := 'aa' asParser star, $b asParser.
       
   127     
       
   128     self scan: 'b' token: #token.
       
   129     self scan: 'aab' token: #token.
       
   130     self scan: 'aaaab' token: #token.
       
   131     self scan: 'aaaaaab' token: #token.
       
   132 
       
   133 
       
   134     self failScan: 'ab'.
       
   135     self failScan: 'aaa'.
       
   136 !
       
   137 
       
   138 testAB
       
   139     parser := 'ab' asParser.
       
   140     
       
   141     self compile.
       
   142 
       
   143     self assert: fsa isDeterministic.
       
   144     self assert: fsa isWithoutEpsilons.	
       
   145     
       
   146     self failScan: ''.
       
   147     self failScan: 'b'.
       
   148 
       
   149     self scan: 'ab' token: #token position: 2.
       
   150     self scan: 'aba' token: #token position: 2.
       
   151 !
       
   152 
       
   153 testA_BCorCD_D
       
   154     parser := $a asParser, ('bc' asParser / 'cd' asParser), $d asParser.
       
   155     
       
   156     self scan: 'abcd' token: #token.
       
   157     self scan: 'acdd' token: #token.
       
   158 
       
   159     self failScan: 'abdd'.
       
   160     self failScan: 'ad'.
       
   161     self failScan: 'aacd'.
       
   162 !
       
   163 
       
   164 testA_BCorCDplus_D
       
   165     parser := $a asParser, ('bc' asParser / 'cd' asParser) plus, $d asParser.
       
   166     
       
   167     self scan: 'abcd' token: #token.
       
   168     self scan: 'acdd' token: #token.
       
   169     self scan: 'abcbccdd' token: #token.
       
   170     self scan: 'acdcdbcbcd' token: #token.
       
   171 
       
   172     self failScan: 'abdd'.
       
   173     self failScan: 'ad'.
       
   174     self failScan: 'abcccd'.
       
   175 !
       
   176 
       
   177 testA_BCorCDstar_D
       
   178     parser := $a asParser, ('bc' asParser / 'cd' asParser) star, $d asParser.
       
   179     
       
   180     self scan: 'ad' token: #token.
       
   181     self scan: 'abcd' token: #token.
       
   182     self scan: 'acdd' token: #token.
       
   183     self scan: 'abcbccdd' token: #token.
       
   184     self scan: 'acdcdbcbcd' token: #token.
       
   185 
       
   186     self failScan: 'abdd'.
       
   187     self failScan: 'abcccd'.
       
   188 !
       
   189 
       
   190 testA_Bnot
       
   191     parser := 'a' asParser, $b asParser not.
       
   192     
       
   193     self compile.
       
   194 
       
   195     self assert: fsa isDeterministic.
       
   196     self assert: fsa isWithoutEpsilons.	
       
   197     
       
   198     self failScan: 'ab'.
       
   199     self failScan: 'bb'.
       
   200 
       
   201     self scan: 'a' token: #token position: 1.
       
   202     self scan: 'ac' token: #token position: 1.
       
   203 !
       
   204 
       
   205 testA_Boptional
       
   206     parser := $a asParser, $b asParser optional.
       
   207     
       
   208     self compile.
       
   209 
       
   210     self assert: fsa isDeterministic.
       
   211     self assert: fsa isWithoutEpsilons.	
       
   212     
       
   213     self failScan: ''.
       
   214     self failScan: 'b'.
       
   215 
       
   216     self scan: 'ab' token: #token position: 2.
       
   217     self scan: 'ac' token: #token position: 1.
       
   218     self scan: 'a' token: #token position: 1.
       
   219 !
       
   220 
       
   221 testA_BorC_D
       
   222     parser := $a asParser, ($b asParser / $c asParser), $d asParser.
       
   223     
       
   224     self scan: 'abd' token: #token.
       
   225     self scan: 'acd' token: #token.
       
   226 
       
   227     self failScan: 'a'.
       
   228     self failScan: 'abc'.
       
   229     self failScan: 'add'.
       
   230 !
       
   231 
       
   232 testA_BorCplus_D
       
   233     parser := $a asParser, ($b asParser / $c asParser) plus, $d asParser.
       
   234     
       
   235     self scan: 'abd' token: #token.
       
   236     self scan: 'acd' token: #token.
       
   237     self scan: 'abcbcd' token: #token.
       
   238     self scan: 'acbcbcd' token: #token.
       
   239 
       
   240     self failScan: 'a'.
       
   241     self failScan: 'ad'.
       
   242     self failScan: 'abc'.
       
   243     self failScan: 'aad'.
       
   244 !
       
   245 
       
   246 testA_BorCstar_D
       
   247     parser := $a asParser, ($b asParser / $c asParser) star, $d asParser.
       
   248     
       
   249     self scan: 'ad' token: #token.
       
   250     self scan: 'abd' token: #token.
       
   251     self scan: 'acd' token: #token.
       
   252     self scan: 'abcbcd' token: #token.
       
   253     self scan: 'acbcbcd' token: #token.
       
   254 
       
   255     self failScan: 'a'.
       
   256     self failScan: 'abc'.
       
   257     self failScan: 'aad'.
       
   258 !
       
   259 
       
   260 testAorAA
       
   261     parser := 'a' asParser / 'aa' asParser.
       
   262     self compile.
       
   263 
       
   264     self assert: fsa isDeterministic.
       
   265     self assert: fsa isWithoutEpsilons.	
       
   266     
       
   267     self failScan: ''.
       
   268     self failScan: 'b'.
       
   269 
       
   270     self scan: 'aa' token: #token position: 1.
       
   271     self scan: 'a' token: #token position: 1.
       
   272 !
       
   273 
       
   274 testAorAX_X
       
   275     parser := ('a' asParser / 'ax' asParser), $x asParser.
       
   276     
       
   277     self compile.
       
   278 
       
   279     self assert: fsa isDeterministic.
       
   280     self assert: fsa isWithoutEpsilons.	
       
   281     
       
   282     self scan: 'ax' token: #token position: 2.
       
   283     self scan: 'axx' token: #token position: 2.	
       
   284 
       
   285     self failScan: 'a'.
       
   286     self failScan: 'x'.
       
   287     self failScan: ''.		
       
   288 !
       
   289 
       
   290 testAorB
       
   291     parser := $a asParser / $b asParser.
       
   292     
       
   293     self compile.
       
   294 
       
   295     self assert: fsa isDeterministic.
       
   296     self assert: fsa isWithoutEpsilons.	
       
   297     
       
   298     self failScan: ''.
       
   299     self failScan: 'c'.
       
   300 
       
   301     self scan: 'aa' token: #token position: 1.
       
   302     self scan: 'bb' token: #token position: 1.
       
   303 !
       
   304 
       
   305 testAplus_B
       
   306     parser := $a asParser plus, $b asParser.
       
   307     
       
   308     self scan: 'ab' token: #token.
       
   309     self scan: 'aab' token: #token.
       
   310     self scan: 'aaab' token: #token.
       
   311 
       
   312     self failScan: 'b'.
       
   313     self failScan: 'ac'.
       
   314 !
       
   315 
       
   316 testAstar_A
       
   317     parser := $a asParser star, $a asParser.
       
   318     
       
   319     self failScan: 'a'.
       
   320     self failScan: 'aa'.
       
   321     self failScan: 'ac'.
       
   322 !
       
   323 
       
   324 testAstar_B
       
   325     parser := $a asParser star, $b asParser.
       
   326     
       
   327     self scan: 'b' token: #token.
       
   328     self scan: 'ab' token: #token.
       
   329     self scan: 'aab' token: #token.
       
   330 
       
   331     self failScan: ''.
       
   332     self failScan: 'ac'.
       
   333 !
       
   334 
       
   335 testAstar_Bnot
       
   336     parser := 'a' asParser star, $b asParser not.
       
   337     
       
   338     self compile.
       
   339 
       
   340     self assert: fsa isDeterministic.
       
   341     self assert: fsa isWithoutEpsilons.	
       
   342     
       
   343     self failScan: 'aaab'.
       
   344     self failScan: 'b'.
       
   345 
       
   346     self scan: '' token: #token position: 0.
       
   347     self scan: 'a' token: #token position: 1.
       
   348     self scan: 'aac' token: #token position: 2.
       
   349     self scan: 'aaaac' token: #token position: 4.
       
   350 !
       
   351 
       
   352 testFoo
       
   353     parser := 'foo' asParser.
       
   354     
       
   355     self scan: 'foo' token: #token.
       
   356     self scan: 'foobar' token: #token position: 3.
       
   357 
       
   358     self failScan: 'bar'.
       
   359     self failScan: 'fo'.
       
   360 !
       
   361 
       
   362 testNumber
       
   363     parser := #digit asParser plus.
       
   364     
       
   365     self compile.
       
   366 
       
   367     self assert: fsa isDeterministic.
       
   368     self assert: fsa isWithoutEpsilons.	
       
   369     
       
   370     self failScan: ''.
       
   371     self failScan: 'b'.
       
   372 
       
   373     self scan: '12' token: #token position: 2.
       
   374     self scan: '2312' token: #token position: 4.
       
   375 !
       
   376 
       
   377 testSmalltalkIdentifier
       
   378     parser := #letter asParser, #word asParser star, $: asParser not.
       
   379     self compile.
       
   380 
       
   381     self assert: fsa isDeterministic.
       
   382     self assert: fsa isWithoutEpsilons.	
       
   383 
       
   384     self scan: 'a' token: #token.
       
   385     self scan: 'hithere' token: #token.
       
   386     self scan: 'hi123' token: #token.
       
   387 
       
   388     self failScan: ''.
       
   389     self failScan: 'aaa:'.
       
   390     self failScan: '123'.	
       
   391 ! !
       
   392