compiler/tests/PEGFsaGeneratorTest.st
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
child 518 a6d8b93441b0
equal deleted inserted replaced
502:1e45d3c96ec5 515:b5316ef15274
    38     ^ result
    38     ^ result
    39 !
    39 !
    40 
    40 
    41 fsaFrom: aNode
    41 fsaFrom: aNode
    42     ^ (aNode accept: generator)
    42     ^ (aNode accept: generator)
    43         compact;
    43         determinize;
       
    44         minimize;
    44         yourself
    45         yourself
    45 !
    46 !
    46 
    47 
    47 setUp
    48 setUp
    48     super setUp.
    49     super setUp.
    49     generator := PEGFsaGenerator new.
    50     generator := PEGFsaGenerator new.
    50     interpreter := PEGFsaInterpret new.	
    51     interpreter := PEGFsaInterpret new.	
    51 !
    52 ! !
    52 
    53 
    53 testAAA_Aplusnot
    54 !PEGFsaGeneratorTest methodsFor:'basic'!
       
    55 
       
    56 testAnyNode
       
    57     node := PPCAnyNode new
       
    58         yourself.
       
    59         
       
    60     fsa := self fsaFrom: node.
       
    61     
       
    62     self assert: fsa parse: 'a'.
       
    63     self assert: fsa parse: 'b'.
       
    64     self assert: fsa parse: String cr.
       
    65     self assert: fsa parse: String tab.
       
    66 !
       
    67 
       
    68 testCharSetPredicateNode
       
    69     node := PPCCharSetPredicateNode new 
       
    70         predicate: (PPCharSetPredicate on: [ :e | e = $a ]);
       
    71         yourself.
       
    72         
       
    73     fsa := self fsaFrom: node.
       
    74     
       
    75     self assert: fsa parse: 'a' end: 1.
       
    76     self assert: fsa parse: 'ab' end: 1.
       
    77     self assert: fsa fail: 'b'.
       
    78 !
       
    79 
       
    80 testCharSetPredicateNode2
       
    81     node := PPCCharSetPredicateNode new 
       
    82         predicate: (PPCharSetPredicate on: [ :e | e isDigit ]);
       
    83         yourself.
       
    84         
       
    85     fsa := self fsaFrom: node.
       
    86     
       
    87     self assert: fsa parse: '1' end: 1.
       
    88     self assert: fsa parse: '0' end: 1.
       
    89     self assert: fsa parse: '5' end: 1.
       
    90     self assert: fsa fail: 'a'.
       
    91 !
       
    92 
       
    93 testCharacterNode
       
    94     node := PPCCharacterNode new
       
    95         character: $a;
       
    96         yourself.
       
    97         
       
    98     fsa := self fsaFrom: node.
       
    99     
       
   100     self assert: fsa parse: 'a' end: 1.
       
   101     self assert: fsa parse: 'ab' end: 1.
       
   102     self assert: fsa fail: 'b'.
       
   103 !
       
   104 
       
   105 testChoiceNode
       
   106     | literal1 literal2 |
       
   107     literal1 := PPCLiteralNode new
       
   108         literal: 'foo';
       
   109         yourself.
       
   110     literal2 := PPCLiteralNode new
       
   111         literal: 'bar';
       
   112         yourself.
       
   113     
       
   114     node := PPCChoiceNode new
       
   115         children: { literal1 . literal2 };
       
   116         yourself.
       
   117         
       
   118     fsa := self fsaFrom: node.
       
   119     
       
   120     self assert: fsa parse: 'foo'.
       
   121     self assert: fsa parse: 'bar'.	
       
   122 self assert: fsa fail: 'fof'.		
       
   123 !
       
   124 
       
   125 testEndOfFileNode
       
   126     node := PPCEndOfFileNode new
       
   127         yourself.
       
   128         
       
   129     fsa := self fsaFrom: node.
       
   130     
       
   131     self assert: fsa parse: '' end: 1.
       
   132     self assert: fsa fail: 'a'.	
       
   133 !
       
   134 
       
   135 testLiteralNode
       
   136     node := PPCLiteralNode new
       
   137         literal: 'foo';
       
   138         yourself.
       
   139         
       
   140     fsa := self fsaFrom: node.
       
   141     
       
   142     self assert: fsa parse: 'foo' end: 3.
       
   143     self assert: fsa parse: 'foobar' end: 3.
       
   144     self assert: fsa fail: 'fox'.
       
   145     self assert: fsa fail: 'bar'.
       
   146 !
       
   147 
       
   148 testLiteralNode2
       
   149     node := PPCLiteralNode new
       
   150         literal: '';
       
   151         yourself.
       
   152         
       
   153     fsa := self fsaFrom: node.
       
   154     
       
   155     self assert: fsa parse: ''.
       
   156 !
       
   157 
       
   158 testNotNode
       
   159     | literal  |
       
   160     literal := PPCLiteralNode new
       
   161         literal: 'foo';
       
   162         yourself.
       
   163 
       
   164     node := PPCNotNode new
       
   165         child: literal;
       
   166         yourself.
       
   167     
       
   168     fsa := self fsaFrom: node.
       
   169 
       
   170     self assert: fsa parse: 'fo' end: 0.	
       
   171     self assert: fsa parse: 'z' end: 0.	
       
   172     self assert: fsa parse: 'foO' end: 0.	
       
   173     self assert: fsa parse: 'bar' end: 0.	
       
   174     self assert: fsa parse: ''.
       
   175     self assert: fsa fail: 'foo'.
       
   176 !
       
   177 
       
   178 testPlusNode
       
   179     | literal |
       
   180     literal := PPCLiteralNode new
       
   181         literal: 'foo';
       
   182         yourself.
       
   183     
       
   184     node := PPCPlusNode new
       
   185         child: literal;
       
   186         yourself.
       
   187         
       
   188     fsa := self fsaFrom: node.
       
   189     
       
   190     self assert: fsa fail: ''.
       
   191     self assert: fsa parse: 'foo'.	
       
   192     self assert: fsa parse: 'foofoofoo'.		
       
   193 !
       
   194 
       
   195 testSequenceNode
       
   196     | literal1 literal2 |
       
   197     literal1 := PPCLiteralNode new
       
   198         literal: 'foo';
       
   199         yourself.
       
   200     literal2 := PPCLiteralNode new
       
   201         literal: 'bar';
       
   202         yourself.
       
   203     
       
   204     node := PPCSequenceNode new
       
   205         children: { literal1 . literal2 };
       
   206         yourself.
       
   207         
       
   208     fsa := self fsaFrom: node.
       
   209     
       
   210     self assert: fsa parse: 'foobar'.
       
   211     self assert: fsa fail: 'foo'.	
       
   212     self assert: fsa fail: 'bar'.		
       
   213 !
       
   214 
       
   215 testSequenceNode2
       
   216     | literal1 literal2 literal3 |
       
   217     literal1 := PPCLiteralNode new
       
   218         literal: 'b';
       
   219         yourself.
       
   220     literal2 := PPCLiteralNode new
       
   221         literal: 'a';
       
   222         yourself.
       
   223     literal3 := PPCLiteralNode new
       
   224         literal: 'z';
       
   225         yourself.
       
   226     
       
   227     node := PPCSequenceNode new
       
   228         children: { literal1 . literal2 . literal3 };
       
   229         yourself.
       
   230         
       
   231     fsa := self fsaFrom: node.
       
   232     
       
   233     self assert: fsa parse: 'baz'.
       
   234     self assert: fsa fail: 'bar'.	
       
   235     self assert: fsa fail: 'faz'.		
       
   236     self assert: fsa fail: 'boz'.				
       
   237 !
       
   238 
       
   239 testSequenceNode3
       
   240     | literal1 literal2 literal3 choice |
       
   241     literal1 := PPCLiteralNode new
       
   242         literal: 'a';
       
   243         yourself.
       
   244     literal2 := PPCLiteralNode new
       
   245         literal: 'b';
       
   246         yourself.
       
   247 
       
   248     literal3 := PPCLiteralNode new
       
   249         literal: 'c';
       
   250         yourself.
       
   251 
       
   252 
       
   253     choice := PPCChoiceNode new
       
   254         children: { literal1 . literal2 };
       
   255         yourself.
       
   256     
       
   257     node := PPCSequenceNode new
       
   258         children: { choice . literal3 };
       
   259         yourself.
       
   260         
       
   261     fsa := self fsaFrom: node.
       
   262     
       
   263 
       
   264     self assert: fsa parse: 'ac'.
       
   265     self assert: fsa parse: 'bc'.
       
   266     self assert: fsa fail: 'a'.	
       
   267     self assert: fsa fail: 'b'.		
       
   268     self assert: fsa fail: 'c'.		
       
   269 !
       
   270 
       
   271 testStarNode
       
   272     | literal |
       
   273     literal := PPCLiteralNode new
       
   274         literal: 'foo';
       
   275         yourself.
       
   276     
       
   277     node := PPCStarNode new
       
   278         child: literal;
       
   279         yourself.
       
   280         
       
   281     fsa := self fsaFrom: node.
       
   282     
       
   283     self assert: fsa parse: ''.
       
   284     self assert: fsa parse: 'foo'.	
       
   285     self assert: fsa parse: 'foofoofoo'.		
       
   286 ! !
       
   287 
       
   288 !PEGFsaGeneratorTest methodsFor:'complex'!
       
   289 
       
   290 testAAAAnot_Astar
       
   291     | parser |
       
   292     parser := 'aaaa' asParser not, ($a asParser star).
       
   293     node := parser asCompilerTree.
       
   294         
       
   295     fsa := self fsaFrom: node.
       
   296     
       
   297     self assert: fsa parse: ''.	
       
   298     self assert: fsa parse: 'a'.	
       
   299     self assert: fsa parse: 'aa'.	
       
   300     self assert: fsa parse: 'aaa'.
       
   301 
       
   302     self assert: fsa fail: 'aaaa'.
       
   303     self assert: fsa fail: 'aaaaa'.
       
   304     self assert: fsa fail: 'aaaaaa'.
       
   305     self assert: fsa fail: 'aaaaaaa'.
       
   306 !
       
   307 
       
   308 testAAAAorA_AA
       
   309     | parser |
       
   310     parser := ('aaaaa' asParser / 'a' asParser), 'aa' asParser.
       
   311     node := parser asCompilerTree.
       
   312         
       
   313     fsa := self fsaFrom: node.
       
   314     
       
   315     self assert: fsa parse: 'aaaaaaa'.	
       
   316     self assert: fsa parse: 'aaa'.	
       
   317     self assert: fsa parse: 'aaaa' end: 3.
       
   318 
       
   319     self assert: fsa fail: 'a'.
       
   320     self assert: fsa fail: 'aa'.
       
   321     self assert: fsa fail: 'aaaaa'.
       
   322     self assert: fsa fail: 'aaaaaa'.
       
   323 !
       
   324 
       
   325 testAAAnot_Aplus
    54     | parser |
   326     | parser |
    55     parser := 'aaa' asParser not, $a asParser plus.
   327     parser := 'aaa' asParser not, $a asParser plus.
    56     node := parser asCompilerTree.
   328     node := parser asCompilerTree.
    57         
   329         
    58     fsa := self fsaFrom: node.
   330     fsa := self fsaFrom: node.
    63     self assert: fsa fail: 'aaa'.
   335     self assert: fsa fail: 'aaa'.
    64     self assert: fsa fail: 'aaaa'.
   336     self assert: fsa fail: 'aaaa'.
    65     self assert: fsa fail: 'aaaaa'.
   337     self assert: fsa fail: 'aaaaa'.
    66 !
   338 !
    67 
   339 
       
   340 testAAAorA_A
       
   341     | parser |
       
   342     parser := ('aaa' asParser / 'a' asParser), 'a' asParser.
       
   343     node := parser asCompilerTree.
       
   344 
       
   345     fsa := self fsaFrom: node.
       
   346     
       
   347     self assert: fsa parse: 'aaaa'.	
       
   348     self assert: fsa parse: 'aa'.
       
   349     self assert: fsa fail: 'aaa'.
       
   350     self assert: fsa fail: 'a'.
       
   351 !
       
   352 
       
   353 testAAAorA_AA
       
   354     | parser |
       
   355     parser := ('aaa' asParser / 'a' asParser), 'aa' asParser.
       
   356     node := parser asCompilerTree.
       
   357         
       
   358     fsa := self fsaFrom: node.
       
   359     
       
   360     self assert: fsa parse: 'aaaaa'.	
       
   361     self assert: fsa parse: 'aaaaaa' end: 5.	
       
   362     self assert: fsa parse: 'aaaaaaa' end: 5.	
       
   363 
       
   364     self assert: fsa fail: 'a'.
       
   365     self assert: fsa fail: 'aa'.
       
   366     self assert: fsa fail: 'aaa'.
       
   367     self assert: fsa fail: 'aaaa'.
       
   368 !
       
   369 
       
   370 testAAAorA_Astar
       
   371     | parser |
       
   372     parser := (('aaa' asParser / 'a' asParser), 'a' asParser) star.
       
   373     node := parser asCompilerTree.
       
   374 
       
   375     fsa := self fsaFrom: node.
       
   376     
       
   377     self assert: fsa parse: ''.
       
   378     self assert: fsa parse: 'aa'.
       
   379     self assert: fsa parse: 'aaaa'.	
       
   380     self assert: fsa parse: 'aaaaaa'.	
       
   381     self assert: fsa parse: 'aaaaaaaa'.	
       
   382 
       
   383     "So far the FSA cannot handle loops with such as tokens as aaa/a, a"
       
   384     self flag: 'not working :('.
       
   385     self assert: fsa parse: 'aaaaaaa' end: 4.	
       
   386 
       
   387     self assert: fsa fail: 'aaa'.
       
   388     self assert: fsa fail: 'a'.
       
   389 !
       
   390 
       
   391 testAAAstar_AA
       
   392     | parser |
       
   393     parser := ('aaa' asParser) star, 'aa' asParser.
       
   394     node := parser asCompilerTree.
       
   395         
       
   396     fsa := self fsaFrom: node.
       
   397     
       
   398     self assert: fsa parse: 'aa'.
       
   399     self assert: fsa parse: 'aaaaa'.	
       
   400     self assert: fsa parse: 'aaaaaaaa'.
       
   401     
       
   402     self assert: fsa fail: 'a'.
       
   403     self assert: fsa fail: 'aaa'.
       
   404     self assert: fsa fail: 'aaaa'.
       
   405     self assert: fsa fail: 'aaaaaaa'.
       
   406 !
       
   407 
       
   408 testAAorA_A
       
   409     | parser |
       
   410     parser := ('aa' asParser / 'a' asParser), 'a' asParser.
       
   411     node := parser asCompilerTree.
       
   412         
       
   413     fsa := self fsaFrom: node.
       
   414     
       
   415     self assert: fsa parse: 'aaa'.	
       
   416     self assert: fsa fail: 'aa'.
       
   417     self assert: fsa fail: 'a'.
       
   418 !
       
   419 
       
   420 testAAorA_AAorA
       
   421     | parser |
       
   422     parser := ('aa' asParser / 'a' asParser), ('aa' asParser / 'a' asParser).
       
   423     node := parser asCompilerTree.
       
   424         
       
   425     fsa := self fsaFrom: node.
       
   426     
       
   427     self assert: fsa parse: 'aaaa'.	
       
   428     self assert: fsa parse: 'aaa'.	
       
   429 
       
   430     self assert: fsa fail: ''.
       
   431     self assert: fsa fail: 'a'.
       
   432     self assert: fsa fail: 'aa'.
       
   433 !
       
   434 
       
   435 testAAorA_A_B
       
   436     | parser |
       
   437     parser := ('aa' asParser / 'a' asParser), 'a' asParser, 'b' asParser.
       
   438     node := parser asCompilerTree.
       
   439         
       
   440     fsa := self fsaFrom: node.
       
   441     
       
   442     self assert: fsa parse: 'aaab'.	
       
   443     self assert: fsa fail: 'aab'.
       
   444 !
       
   445 
    68 testAAplusA
   446 testAAplusA
    69     | parser |
   447     | parser |
    70     parser := 'aa' asParser plus, $a asParser.
   448     parser := 'aa' asParser plus, $a asParser.
    71     node := parser asCompilerTree.
   449     node := parser asCompilerTree.
    72         
   450         
   104     
   482     
   105     self assert: fsa parse: 'ab'.	
   483     self assert: fsa parse: 'ab'.	
   106     self assert: fsa fail: 'a'.
   484     self assert: fsa fail: 'a'.
   107     self assert: fsa fail: 'b'.
   485     self assert: fsa fail: 'b'.
   108     self assert: fsa fail: 'ac'.
   486     self assert: fsa fail: 'ac'.
       
   487 !
       
   488 
       
   489 testA_Bnot
       
   490     | parser |
       
   491     parser := $a asParser, $b asParser not.
       
   492     node := parser asCompilerTree.
       
   493         
       
   494     fsa := self fsaFrom: node.
       
   495     
       
   496     self assert: fsa parse: 'a'.
       
   497     self assert: fsa parse: 'ac' end: 1.	
       
   498     self assert: fsa parse: 'aaa' end: 1.	
       
   499     self assert: fsa fail: 'ab'.
       
   500     self assert: fsa fail: 'b'.
   109 !
   501 !
   110 
   502 
   111 testA_Boptional
   503 testA_Boptional
   112     | parser |
   504     | parser |
   113     parser := $a asParser, $b asParser optional.
   505     parser := $a asParser, $b asParser optional.
   144     self assert: fsa parse: 'abd'.	
   536     self assert: fsa parse: 'abd'.	
   145     self assert: fsa parse: 'acd'.	
   537     self assert: fsa parse: 'acd'.	
   146     self assert: fsa fail: 'abc'.
   538     self assert: fsa fail: 'abc'.
   147     self assert: fsa fail: 'add'.
   539     self assert: fsa fail: 'add'.
   148     self assert: fsa fail: 'ad'.
   540     self assert: fsa fail: 'ad'.
       
   541 !
       
   542 
       
   543 testAoptional_Boptional
       
   544     | parser |
       
   545     parser := $a asParser optional, $b asParser optional.
       
   546     node := parser asCompilerTree.
       
   547         
       
   548     fsa := self fsaFrom: node.
       
   549     self assert: fsa parse: 'ab'.	
       
   550     self assert: fsa parse: 'ac' end: 1.	
       
   551     self assert: fsa parse: 'bc' end: 1.	
       
   552     self assert: fsa parse: 'a'.
       
   553     self assert: fsa parse: 'b'.
       
   554     self assert: fsa parse: 'c' end: 0.
       
   555     self assert: fsa parse: ''.
       
   556 !
       
   557 
       
   558 testAoptionalstar
       
   559     | parser |
       
   560     parser := 'a' asParser optional star.
       
   561     node := parser asCompilerTree.
       
   562         
       
   563     self should: [fsa := self fsaFrom: node] raise: Exception.
       
   564     
   149 !
   565 !
   150 
   566 
   151 testAorAA
   567 testAorAA
   152     | parser |
   568     | parser |
   153     parser := 'a' asParser / 'aa' asParser.
   569     parser := 'a' asParser / 'aa' asParser.
   207     self assert: fsa parse: 'bd' end: 1.	
   623     self assert: fsa parse: 'bd' end: 1.	
   208     self assert: fsa parse: 'd' end: 0.	
   624     self assert: fsa parse: 'd' end: 0.	
   209     self assert: fsa parse: 'c' end: 0.
   625     self assert: fsa parse: 'c' end: 0.
   210 !
   626 !
   211 
   627 
       
   628 testAplusA
       
   629     | parser |
       
   630     parser := $a asParser plus, $a asParser.
       
   631     node := parser asCompilerTree.
       
   632         
       
   633     fsa := self fsaFrom: node.
       
   634     
       
   635     self assert: fsa fail: 'a'.
       
   636     self assert: fsa fail: 'aa'.
       
   637     self assert: fsa fail: 'aaa'.
       
   638 !
       
   639 
       
   640 testAplusB
       
   641     | parser |
       
   642     parser := $a asParser plus, $b asParser.
       
   643     node := parser asCompilerTree.
       
   644         
       
   645     fsa := self fsaFrom: node.
       
   646     
       
   647     self assert: fsa parse: 'ab'.	
       
   648     self assert: fsa parse: 'aaab'.	
       
   649     self assert: fsa parse: 'ab'.	
       
   650 
       
   651     self assert: fsa fail: 'b'.
       
   652     self assert: fsa fail: 'a'.
       
   653     self assert: fsa fail: 'ac'.
       
   654     self assert: fsa fail: 'aac'.
       
   655 !
       
   656 
   212 testAstarA
   657 testAstarA
   213     | parser |
   658     | parser |
   214     parser := $a asParser star, $a asParser.
   659     parser := $a asParser star, $a asParser.
   215     node := parser asCompilerTree.
   660     node := parser asCompilerTree.
   216         
   661         
   232     self assert: fsa parse: 'ab'.	
   677     self assert: fsa parse: 'ab'.	
   233     self assert: fsa parse: 'aaab'.	
   678     self assert: fsa parse: 'aaab'.	
   234     self assert: fsa fail: 'a'.
   679     self assert: fsa fail: 'a'.
   235     self assert: fsa fail: 'ac'.
   680     self assert: fsa fail: 'ac'.
   236     self assert: fsa fail: 'aac'.
   681     self assert: fsa fail: 'aac'.
       
   682 !
       
   683 
       
   684 testAstar_Bplus
       
   685     | parser |
       
   686     parser := 'a' asParser star, 'b' asParser plus.
       
   687     node := parser asCompilerTree.
       
   688         
       
   689     
       
   690     fsa := self fsaFrom: node.
       
   691     
       
   692     self assert: fsa parse: 'b'.
       
   693     self assert: fsa parse: 'bbbb'.
       
   694     self assert: fsa parse: 'aaaab'.
       
   695 
       
   696     self assert: fsa fail: 'a'.
       
   697     self assert: fsa fail: 'aaa'.
   237 !
   698 !
   238 
   699 
   239 testCharSet
   700 testCharSet
   240     | parser |
   701     | parser |
   241     parser := #letter asParser.
   702     parser := #letter asParser.
   250     self assert: fsa fail: '_'.
   711     self assert: fsa fail: '_'.
   251     self assert: fsa fail: '()'.
   712     self assert: fsa fail: '()'.
   252     self assert: fsa fail: ''.
   713     self assert: fsa fail: ''.
   253 !
   714 !
   254 
   715 
   255 testCharSetPredicateNode
   716 testChoice
   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 |
   717     | parser |
   314     parser := ($a asParser optional, $b asParser optional) / $a asParser.
   718     parser := ($a asParser optional, $b asParser optional) / $a asParser.
   315     node := parser asCompilerTree.
   719     node := parser asCompilerTree.
   316         
   720     
   317     fsa := self fsaFrom: node.
   721     fsa := self fsaFrom: node.
   318     
   722     
   319     self assert: fsa parse: 'ab'.	
   723     self assert: fsa parse: 'ab'.	
   320     self assert: fsa parse: 'a' end: 1.	
   724     self assert: fsa parse: 'a' end: 1.	
   321     self assert: fsa parse: 'b' end: 1.	
   725     self assert: fsa parse: 'b' end: 1.	
   322     self assert: fsa parse: ''.
   726     self assert: fsa parse: ''.
   323     self assert: fsa parse: 'c' end: 0.
   727     self assert: fsa parse: 'c' end: 0.
   324 !
   728 !
   325 
   729 
   326 testLiteralNode
   730 testChoice2
   327     node := PPCLiteralNode new
   731     | parser |
   328         literal: 'foo';
   732     parser := 'aaa' asParser / 'aa' asParser / 'a' asParser.
   329         yourself.
   733     node := parser asCompilerTree.
   330         
   734         
   331     fsa := self fsaFrom: node.
   735     fsa := self fsaFrom: node.
   332     
   736     
   333     self assert: fsa parse: 'foo' end: 3.
   737     self assert: fsa parse: 'aaa'.	
   334     self assert: fsa parse: 'foobar' end: 3.
   738     self assert: fsa parse: 'aa'.
   335     self assert: fsa fail: 'fox'.
   739     self assert: fsa parse: 'a'
   336     self assert: fsa fail: 'bar'.
   740 !
   337 !
   741 
   338 
   742 testIdentity
   339 testLiteralNode2
   743     | parser quot |
   340     node := PPCLiteralNode new
   744     quot := $" asParser.
   341         literal: '';
   745     parser := quot, $a asParser star, quot.
   342         yourself.
   746     node := parser asCompilerTree.
   343         
   747         
   344     fsa := self fsaFrom: node.
   748     fsa := self fsaFrom: node.
   345     
   749     
   346     self assert: fsa parse: ''.
   750     self assert: fsa parse: '""'.
       
   751     self assert: fsa parse: '"a"'.
       
   752     self assert: fsa parse: '"aa"'.
       
   753     self assert: fsa parse: '"aaaaaaaa"'.
       
   754 !
       
   755 
       
   756 testKwPlus
       
   757     | parser |
       
   758     parser := (#word asParser plus, $: asParser) plus.
       
   759     node := parser asCompilerTree.
       
   760         
       
   761     fsa := self fsaFrom: node.
       
   762     
       
   763     self assert: fsa parse: 'foo:bar:baz:'.	
       
   764     self assert: fsa parse: 'foo:bar:baz' end: 8.	
       
   765 
       
   766     self assert: fsa fail: ''.
       
   767     self assert: fsa fail: 'foo'.
   347 !
   768 !
   348 
   769 
   349 testNot
   770 testNot
   350     | parser |
   771     | parser |
   351     parser := 'aaa' asParser not, $a asParser plus.
   772     parser := 'aaa' asParser not, $a asParser plus.
   352     node := parser asCompilerTree.
   773     node := parser asCompilerTree.
       
   774     
   353     fsa := self fsaFrom: node.
   775     fsa := self fsaFrom: node.
   354     
   776     
   355     self assert: fsa parse: 'a'.	
   777     self assert: fsa parse: 'a'.	
   356     self assert: fsa parse: 'aa'.	
   778     self assert: fsa parse: 'aa'.	
   357     self assert: fsa fail: 'aaa'.
   779     self assert: fsa fail: 'aaa'.
   358     self assert: fsa fail: 'aaaa'.
   780     self assert: fsa fail: 'aaaa'.
       
   781     self assert: fsa fail: 'aaaaa'.
   359     self assert: fsa fail: ''.
   782     self assert: fsa fail: ''.
   360 !
   783 !
   361 
   784 
   362 testNotNode
   785 testOptional
   363     | literal  |
   786     | parser |
   364     literal := PPCLiteralNode new
   787     parser := ($a asParser optional, $b asParser optional) / $a asParser.
   365         literal: 'foo';
   788     node := parser asCompilerTree.
   366         yourself.
   789         
   367 
   790     fsa := self fsaFrom: node.
   368     node := PPCNotNode new
   791     
   369         child: literal;
   792     self assert: fsa parse: 'ab'.	
   370         yourself.
   793     self assert: fsa parse: 'a' end: 1.	
   371     
   794     self assert: fsa parse: 'b' end: 1.	
   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: ''.
   795     self assert: fsa parse: ''.
   379     self assert: fsa fail: 'foo'.
   796     self assert: fsa parse: 'c' end: 0.
   380 !
   797 !
   381 
   798 
   382 testPlusNode
   799 testOptional2
   383     | literal |
   800     | parser |
   384     literal := PPCLiteralNode new
   801     parser := ($a asParser, $b asParser optional) / 'ac' asParser.
   385         literal: 'foo';
   802     node := parser asCompilerTree.
   386         yourself.
   803         
   387     
   804     fsa := self fsaFrom: node.
   388     node := PPCPlusNode new
   805     
   389         child: literal;
   806     self assert: fsa parse: 'ab'.	
   390         yourself.
   807     self assert: fsa parse: 'a'.	
   391         
   808     self assert: fsa fail: 'b'.	
   392     fsa := self fsaFrom: node.
   809     self assert: fsa parse: 'ac' end: 1.	
   393     
   810 !
       
   811 
       
   812 testPlus
       
   813     | parser |
       
   814     parser := ('aa' asParser) plus, ('a' asParser / 'aa' asParser).
       
   815     node := parser asCompilerTree.
       
   816         
       
   817     fsa := self fsaFrom: node.
       
   818     
       
   819     self assert: fsa parse: 'aaa'.	
       
   820     self assert: fsa parse: 'aaaaa'.
       
   821 
       
   822     self assert: fsa fail: 'a'.
       
   823     self assert: fsa fail: 'aa'.
       
   824     self assert: fsa fail: 'aaaa'.
       
   825 !
       
   826 
       
   827 testPlus2
       
   828     | parser |
       
   829     parser := ('aaaaaa' asParser / 'a' asParser) plus.
       
   830     node := parser asCompilerTree.
       
   831         
       
   832     fsa := self fsaFrom: node.
       
   833     
       
   834     self assert: fsa parse: 'a'.	
       
   835     self assert: fsa parse: 'aa'.
       
   836     self assert: fsa parse: 'aaa'.
       
   837     self assert: fsa parse: 'aaaa'.
       
   838     self assert: fsa parse: 'aaaaa'.
       
   839     self assert: fsa parse: 'aaaaaa'.
       
   840     self assert: fsa parse: 'aaaaaaa'.
       
   841 
   394     self assert: fsa fail: ''.
   842     self assert: fsa fail: ''.
       
   843 !
       
   844 
       
   845 testPlus3
       
   846     | parser |
       
   847     parser := ('aaaaaa' asParser / 'aa' asParser) plus.
       
   848     node := parser asCompilerTree.
       
   849         
       
   850     fsa := self fsaFrom: node.
       
   851     
       
   852     self assert: fsa parse: 'aa'.
       
   853     self assert: fsa parse: 'aaaa'.
       
   854     self assert: fsa parse: 'aaaaaa'.
       
   855 
       
   856     self assert: fsa fail: ''.
       
   857     self assert: fsa fail: 'a'.
       
   858 
       
   859     self assert: fsa parse: 'aaa' end: 2.
       
   860     self assert: fsa parse: 'aaaaa' end: 4.
       
   861     self assert: fsa parse: 'aaaaaaa' end: 6.
       
   862     
       
   863 !
       
   864 
       
   865 testPlus4
       
   866     | parser |
       
   867     parser := ('aaa' asParser / 'aa' asParser / 'a' asParser) plus.
       
   868     node := parser asCompilerTree.
       
   869         
       
   870         
       
   871     fsa := self fsaFrom: node.
       
   872     
       
   873     self assert: fsa parse: 'a'.
       
   874     self assert: fsa parse: 'aa'.
       
   875     self assert: fsa parse: 'aaa'.
       
   876     self assert: fsa parse: 'aaaa'.
       
   877     self assert: fsa parse: 'aaaaa'.
       
   878     self assert: fsa parse: 'aaaaaa'.
       
   879 !
       
   880 
       
   881 testPlus5
       
   882     | parser |
       
   883     parser := ('aaa' asParser / 'aa' asParser / 'b' asParser) plus.
       
   884     node := parser asCompilerTree.
       
   885         
       
   886         
       
   887     fsa := self fsaFrom: node.
       
   888 
       
   889 
       
   890     self assert: fsa parse: 'b'.
       
   891     self assert: fsa parse: 'bb'.
       
   892     self assert: fsa parse: 'bbaaa'.
       
   893     self assert: fsa parse: 'bbaaabbaa'.
       
   894     
       
   895     self assert: fsa parse: 'aa'.
       
   896     self assert: fsa parse: 'aaa'.
       
   897     self assert: fsa parse: 'aaaaa'.
       
   898     self assert: fsa parse: 'aaaaaa'.
       
   899     self assert: fsa parse: 'aaaaaab'.
       
   900     
       
   901     self assert: fsa parse: 'bba' end: 2.
       
   902     self assert: fsa parse: 'aaaa' end: 3.
       
   903 !
       
   904 
       
   905 testSequence
       
   906     | parser |
       
   907     parser := ('aa' asParser plus), ('aa' asParser plus).
       
   908     node := parser asCompilerTree.
       
   909         
       
   910     fsa := self fsaFrom: node.
       
   911     
       
   912     self assert: fsa fail: 'a'.
       
   913     self assert: fsa fail: 'aa'.
       
   914     self assert: fsa fail: 'aaa'.
       
   915     self assert: fsa fail: 'aaaa'.
       
   916     self assert: fsa fail: 'aaaaa'.
       
   917     self assert: fsa fail: 'aaaaaa'.
       
   918 !
       
   919 
       
   920 testSequence2
       
   921     | parser |
       
   922     parser := ('aa' asParser star), ('bb' asParser star).
       
   923     node := parser asCompilerTree.
       
   924         
       
   925     fsa := self fsaFrom: node.
       
   926     
       
   927     self assert: fsa parse: 'aa'.
       
   928     self assert: fsa parse: 'aaaa'.
       
   929     self assert: fsa parse: 'aaaaaa'.
       
   930     self assert: fsa parse: 'aaaaaaaa'.
       
   931 
       
   932     self assert: fsa parse: 'a' end: 0.
       
   933     self assert: fsa parse: 'aaa' end: 2.
       
   934     self assert: fsa parse: 'aaaaa' end: 4.
       
   935     self assert: fsa parse: 'aaaaaaa' end: 6.
       
   936     self assert: fsa parse: 'aaaaaaaaa' end: 8.
       
   937 !
       
   938 
       
   939 testSequence3
       
   940     | parser |
       
   941     parser := 'a' asParser, 'b' asParser.
       
   942     node := parser asCompilerTree.
       
   943         
       
   944     fsa := self fsaFrom: node.
       
   945     
       
   946     self assert: (fsa states noneSatisfy: [ :s | s isFsaFailure  ]).
       
   947 !
       
   948 
       
   949 testSequence4
       
   950     | parser |
       
   951     parser := 'a' asParser star, 'b' asParser.
       
   952     node := parser asCompilerTree.
       
   953         
       
   954     fsa := self fsaFrom: node.
       
   955     
       
   956     self assert: (fsa states noneSatisfy: [ :s | s isFsaFailure  ]).
       
   957 !
       
   958 
       
   959 testUnaryOrKw
       
   960     | parser unary kw |
       
   961     unary := #letter asParser plus, $: asParser not.
       
   962     kw := #letter asParser plus, $: asParser.
       
   963     parser := unary / kw.
       
   964     node := parser asCompilerTree.
       
   965         
       
   966     fsa := self fsaFrom: node.
       
   967     
   395     self assert: fsa parse: 'foo'.	
   968     self assert: fsa parse: 'foo'.	
   396     self assert: fsa parse: 'foofoofoo'.		
   969     self assert: fsa parse: 'foo:'.	
   397 !
   970 
   398 
   971     self assert: fsa fail: '123'.
   399 testSequenceNode
   972 !
   400     | literal1 literal2 |
   973 
   401     literal1 := PPCLiteralNode new
   974 testUnaryOrKwPlus
   402         literal: 'foo';
   975     | parser unary kw |
   403         yourself.
   976     unary := #letter asParser plus, $: asParser not.
   404     literal2 := PPCLiteralNode new
   977     kw := #letter asParser plus, $: asParser.
   405         literal: 'bar';
   978     parser := (unary / kw) plus.
   406         yourself.
   979     node := parser asCompilerTree.
   407     
   980         
   408     node := PPCSequenceNode new
   981     fsa := self fsaFrom: node.
   409         children: { literal1 . literal2 };
   982     
   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'.	
   983     self assert: fsa parse: 'foo'.	
   457     self assert: fsa parse: 'foofoofoo'.		
   984     self assert: fsa parse: 'foo:'.	
       
   985     self assert: fsa parse: 'foo:bar:'.	
       
   986     self assert: fsa fail: '123'.
       
   987 !
       
   988 
       
   989 testUnaryOrMultiword
       
   990     | parser unary kw |
       
   991     unary := #letter asParser plus, $: asParser not.
       
   992     kw := #letter asParser plus, $: asParser.
       
   993     parser := unary / (kw plus).
       
   994     node := parser asCompilerTree.
       
   995         
       
   996     fsa := self fsaFrom: node.
       
   997     
       
   998     self assert: fsa parse: 'foo'.	
       
   999     self assert: fsa parse: 'foo:'.	
       
  1000     self assert: fsa parse: 'foo:bar:'.	
       
  1001     self assert: fsa fail: '123'.
       
  1002 ! !
       
  1003 
       
  1004 !PEGFsaGeneratorTest methodsFor:'recursive'!
       
  1005 
       
  1006 testRecursive
       
  1007     | parser |
       
  1008     parser := PPDelegateParser new.
       
  1009     
       
  1010     parser setParser: ($a asParser, parser) / $b asParser.
       
  1011     node := parser asCompilerTree.
       
  1012 
       
  1013     fsa :=	 self fsaFrom: node.
       
  1014 
       
  1015     self assert: fsa parse: 'b'.
       
  1016     self assert: fsa parse: 'ab'.
       
  1017     self assert: fsa parse: 'aaab'.
       
  1018     self assert: fsa fail: 'aaa'.
       
  1019     self assert: fsa fail: ''.	
       
  1020     self assert: fsa fail: 'aac'.		
       
  1021 !
       
  1022 
       
  1023 testRecursive2
       
  1024     | parser |
       
  1025     parser := PPDelegateParser new.
       
  1026     
       
  1027     parser setParser: (($a asParser / $b asParser), parser) / $c asParser.
       
  1028     node := parser asCompilerTree.
       
  1029 
       
  1030     fsa :=	 self fsaFrom: node.
       
  1031 
       
  1032     self assert: fsa parse: 'c'.
       
  1033     self assert: fsa parse: 'ac'.
       
  1034     self assert: fsa parse: 'bc'.
       
  1035     self assert: fsa parse: 'ababc'.
       
  1036     self assert: fsa fail: 'aaab'.
       
  1037     self assert: fsa fail: 'ab'.	
   458 ! !
  1038 ! !
   459 
  1039 
   460 !PEGFsaGeneratorTest class methodsFor:'documentation'!
  1040 !PEGFsaGeneratorTest class methodsFor:'documentation'!
   461 
  1041 
   462 version_HG
  1042 version_HG