compiler/tests/PEGFsaGeneratorTest.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:#PEGFsaGeneratorTest
       
     6 	instanceVariableNames:'result node fsa generator interpreter'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-FSA'
       
    10 !
       
    11 
       
    12 
       
    13 !PEGFsaGeneratorTest methodsFor:'as yet unclassified'!
       
    14 
       
    15 assert: anFsa fail: input
       
    16     | stream |
       
    17     stream := input asPetitStream.
       
    18 
       
    19     result := interpreter interpret: anFsa on: stream.
       
    20 
       
    21     self assert: result isEmpty.
       
    22     ^ result
       
    23 !
       
    24 
       
    25 assert: interpret parse: input 
       
    26     ^ self assert: interpret parse: input end: input size
       
    27 !
       
    28 
       
    29 assert: anFsa parse: input end: end
       
    30     | stream |
       
    31     stream := input asPetitStream.
       
    32 
       
    33     result := interpreter interpret: anFsa on: stream.
       
    34 
       
    35     self assert: result isEmpty not.
       
    36     self assert: (result values anySatisfy: [ :pos | pos = end ]) description: 'wrong position'.
       
    37     
       
    38     ^ result
       
    39 !
       
    40 
       
    41 fsaFrom: aNode
       
    42     ^ (aNode accept: generator)
       
    43         compact;
       
    44         yourself
       
    45 !
       
    46 
       
    47 setUp
       
    48     super setUp.
       
    49     generator := PEGFsaGenerator new.
       
    50     interpreter := PEGFsaInterpret new.	
       
    51 !
       
    52 
       
    53 testAAA_Aplusnot
       
    54     | parser |
       
    55     parser := 'aaa' asParser not, $a asParser plus.
       
    56     node := parser asCompilerTree.
       
    57         
       
    58     fsa := self fsaFrom: node.
       
    59     
       
    60     self assert: fsa parse: 'a'.	
       
    61     self assert: fsa parse: 'aa'.	
       
    62     self assert: fsa fail: ''.
       
    63     self assert: fsa fail: 'aaa'.
       
    64     self assert: fsa fail: 'aaaa'.
       
    65     self assert: fsa fail: 'aaaaa'.
       
    66 !
       
    67 
       
    68 testAAplusA
       
    69     | parser |
       
    70     parser := 'aa' asParser plus, $a asParser.
       
    71     node := parser asCompilerTree.
       
    72         
       
    73     fsa := self fsaFrom: node.
       
    74 
       
    75     self assert: fsa parse: 'aaa'.	
       
    76     self assert: fsa parse: 'aaaaa'.	
       
    77     self assert: fsa parse: 'aaaaaaa'.	
       
    78     self assert: fsa fail: 'a'.
       
    79     self assert: fsa fail: 'aa'.
       
    80     self assert: fsa fail: 'aaaa'.
       
    81 !
       
    82 
       
    83 testAAplusB
       
    84     | parser |
       
    85     parser := 'aa' asParser plus, $b asParser.
       
    86     node := parser asCompilerTree.
       
    87         
       
    88     fsa := self fsaFrom: node.
       
    89     
       
    90     self assert: fsa parse: 'aab'.	
       
    91     self assert: fsa parse: 'aaaab'.	
       
    92     self assert: fsa fail: 'a'.
       
    93     self assert: fsa fail: 'aa'.
       
    94     self assert: fsa fail: 'aaaa'.
       
    95     self assert: fsa fail: 'aaaac'.
       
    96 !
       
    97 
       
    98 testAB
       
    99     | parser |
       
   100     parser := $a asParser, $b asParser.
       
   101     node := parser asCompilerTree.
       
   102         
       
   103     fsa := self fsaFrom: node.
       
   104     
       
   105     self assert: fsa parse: 'ab'.	
       
   106     self assert: fsa fail: 'a'.
       
   107     self assert: fsa fail: 'b'.
       
   108     self assert: fsa fail: 'ac'.
       
   109 !
       
   110 
       
   111 testA_Boptional
       
   112     | parser |
       
   113     parser := $a asParser, $b asParser optional.
       
   114     node := parser asCompilerTree.
       
   115     
       
   116     fsa := self fsaFrom: node.
       
   117     
       
   118     self assert: fsa parse: 'ab'.	
       
   119     self assert: fsa parse: 'ac' end: 1.	
       
   120     self assert: fsa parse: 'a'.
       
   121     self assert: fsa fail: 'b'.
       
   122 !
       
   123 
       
   124 testA_Boptionaloptional
       
   125     | parser |
       
   126     parser := ($a asParser, $b asParser optional) optional.
       
   127     node := parser asCompilerTree.
       
   128         
       
   129     fsa := self fsaFrom: node.
       
   130 
       
   131     self assert: fsa parse: ''.	
       
   132     self assert: fsa parse: 'a'.	
       
   133     self assert: fsa parse: 'ab'.	
       
   134     self assert: fsa parse: 'b' end: 0.
       
   135 !
       
   136 
       
   137 testA_BorC_D
       
   138     | parser |
       
   139     parser := $a asParser, ($b asParser / $c asParser), $d asParser.
       
   140     node := parser asCompilerTree.
       
   141         
       
   142     fsa := self fsaFrom: node.
       
   143     
       
   144     self assert: fsa parse: 'abd'.	
       
   145     self assert: fsa parse: 'acd'.	
       
   146     self assert: fsa fail: 'abc'.
       
   147     self assert: fsa fail: 'add'.
       
   148     self assert: fsa fail: 'ad'.
       
   149 !
       
   150 
       
   151 testAorAA
       
   152     | parser |
       
   153     parser := 'a' asParser / 'aa' asParser.
       
   154     node := parser asCompilerTree.
       
   155         
       
   156     fsa := self fsaFrom: node.
       
   157     
       
   158     self assert: fsa parse: 'a'.	
       
   159     self assert: fsa parse: 'aa' end: 1.	
       
   160     self assert: fsa parse: 'aaaaaaa' end: 1.	
       
   161     self assert: fsa fail: ''.
       
   162     self assert: fsa fail: 'b'.
       
   163 !
       
   164 
       
   165 testAorAX_X
       
   166     | parser |
       
   167     parser := ('a' asParser / 'ax' asParser), $x asParser.
       
   168     node := parser asCompilerTree.
       
   169     
       
   170     fsa := self fsaFrom: node.
       
   171 
       
   172     self assert: fsa parse: 'ax'.	
       
   173     self assert: fsa parse: 'axx' end: 2.	
       
   174     self assert: fsa fail: 'a'.
       
   175     self assert: fsa fail: 'x'.
       
   176     self assert: fsa fail: ''.
       
   177 !
       
   178 
       
   179 testAorBC_X
       
   180     | parser |
       
   181     parser := ('a' asParser / 'bc' asParser), $x asParser.
       
   182     node := parser asCompilerTree.
       
   183         
       
   184     fsa := self fsaFrom: node.
       
   185 
       
   186     self assert: fsa parse: 'ax'.	
       
   187     self assert: fsa parse: 'bcx' end: 3.	
       
   188     self assert: fsa fail: 'bx'.
       
   189     self assert: fsa fail: 'cx'.
       
   190     self assert: fsa fail: 'a'.	
       
   191     self assert: fsa fail: 'bc'.		
       
   192 !
       
   193 
       
   194 testAorB_Coptionaloptional
       
   195     | parser |
       
   196     parser := (($a asParser / $b asParser), $c asParser optional) optional.
       
   197     node := parser asCompilerTree.
       
   198         
       
   199     fsa := self fsaFrom: node.
       
   200 
       
   201     self assert: fsa parse: ''.	
       
   202     self assert: fsa parse: 'a'.	
       
   203     self assert: fsa parse: 'b'.	
       
   204     self assert: fsa parse: 'ac'.	
       
   205     self assert: fsa parse: 'bc'.	
       
   206     self assert: fsa parse: 'ad' end: 1.	
       
   207     self assert: fsa parse: 'bd' end: 1.	
       
   208     self assert: fsa parse: 'd' end: 0.	
       
   209     self assert: fsa parse: 'c' end: 0.
       
   210 !
       
   211 
       
   212 testAstarA
       
   213     | parser |
       
   214     parser := $a asParser star, $a asParser.
       
   215     node := parser asCompilerTree.
       
   216         
       
   217     fsa := self fsaFrom: node.
       
   218     
       
   219     self assert: fsa fail: 'a'.
       
   220     self assert: fsa fail: 'aa'.
       
   221     self assert: fsa fail: 'aaa'.
       
   222 !
       
   223 
       
   224 testAstarB
       
   225     | parser |
       
   226     parser := $a asParser star, $b asParser.
       
   227     node := parser asCompilerTree.
       
   228         
       
   229     fsa := self fsaFrom: node.
       
   230     
       
   231     self assert: fsa parse: 'b'.	
       
   232     self assert: fsa parse: 'ab'.	
       
   233     self assert: fsa parse: 'aaab'.	
       
   234     self assert: fsa fail: 'a'.
       
   235     self assert: fsa fail: 'ac'.
       
   236     self assert: fsa fail: 'aac'.
       
   237 !
       
   238 
       
   239 testCharSet
       
   240     | parser |
       
   241     parser := #letter asParser.
       
   242     node := parser asCompilerTree.
       
   243         
       
   244     fsa := self fsaFrom: node.
       
   245     
       
   246     self assert: fsa parse: 'a'.	
       
   247     self assert: fsa parse: 'z'.	
       
   248     self assert: fsa parse: 'A'.	
       
   249     self assert: fsa parse: 'Z'.	
       
   250     self assert: fsa fail: '_'.
       
   251     self assert: fsa fail: '()'.
       
   252     self assert: fsa fail: ''.
       
   253 !
       
   254 
       
   255 testCharSetPredicateNode
       
   256     node := PPCCharSetPredicateNode new 
       
   257         predicate: (PPCharSetPredicate on: [ :e | e = $a ]);
       
   258         yourself.
       
   259         
       
   260     fsa := self fsaFrom: node.
       
   261     
       
   262     self assert: fsa parse: 'a' end: 1.
       
   263     self assert: fsa parse: 'ab' end: 1.
       
   264     self assert: fsa fail: 'b'.
       
   265 !
       
   266 
       
   267 testCharSetPredicateNode2
       
   268     node := PPCCharSetPredicateNode new 
       
   269         predicate: (PPCharSetPredicate on: [ :e | e isDigit ]);
       
   270         yourself.
       
   271         
       
   272     fsa := self fsaFrom: node.
       
   273     
       
   274     self assert: fsa parse: '1' end: 1.
       
   275     self assert: fsa parse: '0' end: 1.
       
   276     self assert: fsa parse: '5' end: 1.
       
   277     self assert: fsa fail: 'a'.
       
   278 !
       
   279 
       
   280 testCharacterNode
       
   281     node := PPCCharacterNode new
       
   282         character: $a;
       
   283         yourself.
       
   284         
       
   285     fsa := self fsaFrom: node.
       
   286     
       
   287     self assert: fsa parse: 'a' end: 1.
       
   288     self assert: fsa parse: 'ab' end: 1.
       
   289     self assert: fsa fail: 'b'.
       
   290 !
       
   291 
       
   292 testChoiceNode
       
   293     | literal1 literal2 |
       
   294     literal1 := PPCLiteralNode new
       
   295         literal: 'foo';
       
   296         yourself.
       
   297     literal2 := PPCLiteralNode new
       
   298         literal: 'bar';
       
   299         yourself.
       
   300     
       
   301     node := PPCChoiceNode new
       
   302         children: { literal1 . literal2 };
       
   303         yourself.
       
   304         
       
   305     fsa := self fsaFrom: node.
       
   306     
       
   307     self assert: fsa parse: 'foo'.
       
   308     self assert: fsa parse: 'bar'.	
       
   309 self assert: fsa fail: 'fof'.		
       
   310 !
       
   311 
       
   312 testChoicePriorities
       
   313     | parser |
       
   314     parser := ($a asParser optional, $b asParser optional) / $a asParser.
       
   315     node := parser asCompilerTree.
       
   316         
       
   317     fsa := self fsaFrom: node.
       
   318     
       
   319     self assert: fsa parse: 'ab'.	
       
   320     self assert: fsa parse: 'a' end: 1.	
       
   321     self assert: fsa parse: 'b' end: 1.	
       
   322     self assert: fsa parse: ''.
       
   323     self assert: fsa parse: 'c' end: 0.
       
   324 !
       
   325 
       
   326 testLiteralNode
       
   327     node := PPCLiteralNode new
       
   328         literal: 'foo';
       
   329         yourself.
       
   330         
       
   331     fsa := self fsaFrom: node.
       
   332     
       
   333     self assert: fsa parse: 'foo' end: 3.
       
   334     self assert: fsa parse: 'foobar' end: 3.
       
   335     self assert: fsa fail: 'fox'.
       
   336     self assert: fsa fail: 'bar'.
       
   337 !
       
   338 
       
   339 testLiteralNode2
       
   340     node := PPCLiteralNode new
       
   341         literal: '';
       
   342         yourself.
       
   343         
       
   344     fsa := self fsaFrom: node.
       
   345     
       
   346     self assert: fsa parse: ''.
       
   347 !
       
   348 
       
   349 testNot
       
   350     | parser |
       
   351     parser := 'aaa' asParser not, $a asParser plus.
       
   352     node := parser asCompilerTree.
       
   353     fsa := self fsaFrom: node.
       
   354     
       
   355     self assert: fsa parse: 'a'.	
       
   356     self assert: fsa parse: 'aa'.	
       
   357     self assert: fsa fail: 'aaa'.
       
   358     self assert: fsa fail: 'aaaa'.
       
   359     self assert: fsa fail: ''.
       
   360 !
       
   361 
       
   362 testNotNode
       
   363     | literal  |
       
   364     literal := PPCLiteralNode new
       
   365         literal: 'foo';
       
   366         yourself.
       
   367 
       
   368     node := PPCNotNode new
       
   369         child: literal;
       
   370         yourself.
       
   371     
       
   372     fsa := self fsaFrom: node.
       
   373 
       
   374     self assert: fsa parse: 'fo' end: 0.	
       
   375     self assert: fsa parse: 'z' end: 0.	
       
   376     self assert: fsa parse: 'foO' end: 0.	
       
   377     self assert: fsa parse: 'bar' end: 0.	
       
   378     self assert: fsa parse: ''.
       
   379     self assert: fsa fail: 'foo'.
       
   380 !
       
   381 
       
   382 testPlusNode
       
   383     | literal |
       
   384     literal := PPCLiteralNode new
       
   385         literal: 'foo';
       
   386         yourself.
       
   387     
       
   388     node := PPCPlusNode new
       
   389         child: literal;
       
   390         yourself.
       
   391         
       
   392     fsa := self fsaFrom: node.
       
   393     
       
   394     self assert: fsa fail: ''.
       
   395     self assert: fsa parse: 'foo'.	
       
   396     self assert: fsa parse: 'foofoofoo'.		
       
   397 !
       
   398 
       
   399 testSequenceNode
       
   400     | literal1 literal2 |
       
   401     literal1 := PPCLiteralNode new
       
   402         literal: 'foo';
       
   403         yourself.
       
   404     literal2 := PPCLiteralNode new
       
   405         literal: 'bar';
       
   406         yourself.
       
   407     
       
   408     node := PPCSequenceNode new
       
   409         children: { literal1 . literal2 };
       
   410         yourself.
       
   411         
       
   412     fsa := self fsaFrom: node.
       
   413     
       
   414     self assert: fsa parse: 'foobar'.
       
   415     self assert: fsa fail: 'foo'.	
       
   416     self assert: fsa fail: 'bar'.		
       
   417 !
       
   418 
       
   419 testSequenceNode2
       
   420     | literal1 literal2 literal3 |
       
   421     literal1 := PPCLiteralNode new
       
   422         literal: 'b';
       
   423         yourself.
       
   424     literal2 := PPCLiteralNode new
       
   425         literal: 'a';
       
   426         yourself.
       
   427     literal3 := PPCLiteralNode new
       
   428         literal: 'z';
       
   429         yourself.
       
   430     
       
   431     node := PPCSequenceNode new
       
   432         children: { literal1 . literal2 . literal3 };
       
   433         yourself.
       
   434         
       
   435     fsa := self fsaFrom: node.
       
   436     
       
   437     self assert: fsa parse: 'baz'.
       
   438     self assert: fsa fail: 'bar'.	
       
   439     self assert: fsa fail: 'faz'.		
       
   440     self assert: fsa fail: 'boz'.				
       
   441 !
       
   442 
       
   443 testStarNode
       
   444     | literal |
       
   445     literal := PPCLiteralNode new
       
   446         literal: 'foo';
       
   447         yourself.
       
   448     
       
   449     node := PPCStarNode new
       
   450         child: literal;
       
   451         yourself.
       
   452         
       
   453     fsa := self fsaFrom: node.
       
   454     
       
   455     self assert: fsa parse: ''.
       
   456     self assert: fsa parse: 'foo'.	
       
   457     self assert: fsa parse: 'foofoofoo'.		
       
   458 ! !
       
   459 
       
   460 !PEGFsaGeneratorTest class methodsFor:'documentation'!
       
   461 
       
   462 version_HG
       
   463 
       
   464     ^ '$Changeset: <not expanded> $'
       
   465 ! !
       
   466