compiler/tests/PEGFsaIntegrationTest.st
changeset 515 b5316ef15274
equal deleted inserted replaced
502:1e45d3c96ec5 515:b5316ef15274
       
     1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 TestCase subclass:#PEGFsaIntegrationTest
       
     6 	instanceVariableNames:'result node fsa generator interpreter parser1 parser2 parser3'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-FSA'
       
    10 !
       
    11 
       
    12 
       
    13 !PEGFsaIntegrationTest methodsFor:'as yet unclassified'!
       
    14 
       
    15 determinizator
       
    16     ^ PEGFsaDeterminizator new
       
    17 !
       
    18 
       
    19 failScan: input token: token
       
    20     | stream |
       
    21     stream := input asPetitStream.
       
    22 
       
    23     result := interpreter interpret: fsa on: stream.
       
    24     self assert: (result includes: token) not.
       
    25 
       
    26     ^ result
       
    27 !
       
    28 
       
    29 fsaFrom: aNode
       
    30     ^ (aNode accept: generator)
       
    31         determinize;
       
    32         minimize;
       
    33         yourself
       
    34 !
       
    35 
       
    36 merge
       
    37     | startState fsa1 fsa2 fsa3 |
       
    38     fsa := PEGFsa new.
       
    39     startState := PEGFsaState new.
       
    40 
       
    41     fsa addState: startState.	
       
    42     fsa startState: startState.
       
    43 
       
    44     fsa1 := self fsaFrom: parser1 asCompilerTree.
       
    45     fsa1 retval: #token1.
       
    46     fsa adopt: fsa1.
       
    47     fsa addTransitionFrom: startState to: fsa1 startState.
       
    48 
       
    49     fsa2 := self fsaFrom: parser2 asCompilerTree.
       
    50     fsa2 retval: #token2.
       
    51     fsa adopt: fsa2.
       
    52     fsa addTransitionFrom: startState to: fsa2 startState.
       
    53 
       
    54     parser3 isNil ifFalse: [ 
       
    55         fsa3 := self fsaFrom: parser3 asCompilerTree.
       
    56         fsa3 retval: #token3.
       
    57         fsa adopt: fsa3.
       
    58         fsa addTransitionFrom: startState to: fsa3 startState.
       
    59     ].
       
    60     
       
    61     self determinizator determinize: fsa.
       
    62     fsa minimize.
       
    63 !
       
    64 
       
    65 scan: input token: token
       
    66     ^ self scan: input token: token position: input size
       
    67 !
       
    68 
       
    69 scan: input token: token position: position
       
    70     | stream |
       
    71     stream := input asPetitStream.
       
    72 
       
    73     result := interpreter interpret: fsa on: stream.
       
    74 
       
    75     self assert: (result includesKey: token).
       
    76     self assert: (result at: token) = position.
       
    77 
       
    78     ^ result
       
    79 !
       
    80 
       
    81 setUp
       
    82     super setUp.
       
    83     generator := PEGFsaGenerator new.
       
    84     interpreter := PEGFsaInterpret new.	
       
    85 !
       
    86 
       
    87 testFooOrId
       
    88     parser1 := 'foo' asParser.
       
    89     parser2 := #letter asParser plus.
       
    90     
       
    91     self merge.
       
    92 
       
    93     self assert: fsa isDeterministic.
       
    94     self assert: fsa isWithoutEpsilons.	
       
    95     self assert: fsa hasDistinctRetvals not.
       
    96     
       
    97     self failScan: 'bar' token: #token1.
       
    98     self scan: 'bar' token: #token2 position: 3.
       
    99 
       
   100     self scan: 'foo' token: #token1 position: 3.
       
   101     self scan: 'foo' token: #token2 position: 3.
       
   102     
       
   103     self scan: 'foobar' token: #token1 position: 3.
       
   104     self scan: 'foobar' token: #token2 position: 6.
       
   105     
       
   106 !
       
   107 
       
   108 testTrueOrId
       
   109     parser1 := 'true' asParser.
       
   110     parser2 := #letter asParser plus.
       
   111     
       
   112     self merge.
       
   113 
       
   114     self assert: fsa isDeterministic.
       
   115     self assert: fsa isWithoutEpsilons.	
       
   116     self assert: fsa hasDistinctRetvals not.
       
   117     
       
   118     self failScan: 'false' token: #token1.
       
   119     self scan: 'false' token: #token2 position: 5.
       
   120 
       
   121     self scan: 'true' token: #token1 position: 4.
       
   122     self scan: 'true' token: #token2 position: 4.
       
   123     
       
   124     self scan: 'truecrypt' token: #token1 position: 4.
       
   125     self scan: 'truecrypt' token: #token2 position: 9.
       
   126     
       
   127 !
       
   128 
       
   129 testUnaryOrKW
       
   130     parser1 := #letter asParser plus, $: asParser not.
       
   131     parser2 := #letter asParser plus, $: asParser.
       
   132     
       
   133     self merge.
       
   134     self assert: fsa isDeterministic.
       
   135     self assert: fsa isWithoutEpsilons.	
       
   136     
       
   137     self scan: 'foo' token: #token1.
       
   138     self failScan: 'foo' token: #token2.
       
   139 
       
   140     self failScan: 'foo:' token: #token1.
       
   141     self scan: 'foo:' token: #token2.
       
   142 !
       
   143 
       
   144 testUnaryOrKWorId
       
   145     parser1 := #letter asParser plus, $: asParser not.
       
   146     parser2 := #letter asParser plus, $: asParser.
       
   147     parser3 := #letter asParser plus.
       
   148     
       
   149     self merge.
       
   150     self assert: fsa isDeterministic.
       
   151     self assert: fsa isWithoutEpsilons.	
       
   152     
       
   153     self scan: 'foo' token: #token1.
       
   154     self failScan: 'foo' token: #token2.
       
   155     self scan: 'foo' token: #token3.
       
   156 
       
   157     self failScan: 'foo:' token: #token1.
       
   158     self scan: 'foo:' token: #token2.
       
   159     self scan: 'foo' token: #token3.
       
   160 
       
   161 
       
   162     self failScan: '123' token: #token1.
       
   163     self failScan: '123' token: #token2.
       
   164     self failScan: '123' token: #token3.
       
   165     
       
   166 ! !
       
   167 
       
   168 !PEGFsaIntegrationTest class methodsFor:'documentation'!
       
   169 
       
   170 version_HG
       
   171 
       
   172     ^ '$Changeset: <not expanded> $'
       
   173 ! !
       
   174