compiler/tests/PPCScannerCodeGeneratorTest.st
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
child 524 f6f68d32de73
equal deleted inserted replaced
502:1e45d3c96ec5 515:b5316ef15274
    12 !PPCScannerCodeGeneratorTest methodsFor:'as yet unclassified'!
    12 !PPCScannerCodeGeneratorTest methodsFor:'as yet unclassified'!
    13 
    13 
    14 fail: stream rule: rule 
    14 fail: stream rule: rule 
    15     scanner initialize.
    15     scanner initialize.
    16     scanner stream: stream asPetitStream. 
    16     scanner stream: stream asPetitStream. 
    17     result := scanner perform: rule.
    17     scanner perform: rule.
       
    18     
       
    19     result := scanner polyResult.
    18         
    20         
    19     self assert: result isEmpty
    21     self assert: result isEmpty
    20 !
    22 !
    21 
    23 
    22 parse: stream token: token rule: rule
    24 parse: stream token: token rule: rule
    24 !
    26 !
    25 
    27 
    26 parse: stream token: token rule: rule position: position
    28 parse: stream token: token rule: rule position: position
    27     scanner initialize.
    29     scanner initialize.
    28     scanner stream: stream asPetitStream. 
    30     scanner stream: stream asPetitStream. 
    29     result := scanner perform: rule.
    31     scanner perform: rule.
       
    32     result := scanner polyResult.
    30         
    33         
    31     self assert: (result at: token) = position.
    34     self assert: (result at: token) = position.
    32 !
    35 !
    33 
    36 
    34 setUp
    37 setUp
    39     e := PEGFsaState new name: #e; retval: #e; yourself.
    42     e := PEGFsaState new name: #e; retval: #e; yourself.
    40 
    43 
    41     fsa := PEGFsa new.
    44     fsa := PEGFsa new.
    42     
    45     
    43     codeGenerator := PPCScannerCodeGenerator new.
    46     codeGenerator := PPCScannerCodeGenerator new.
    44 !
    47 ! !
       
    48 
       
    49 !PPCScannerCodeGeneratorTest methodsFor:'caching'!
       
    50 
       
    51 testDuplicities
       
    52     fsa addState: a.
       
    53     fsa addState: b.
       
    54     fsa startState: a.
       
    55     fsa finalState: b.
       
    56     
       
    57     fsa addTransitionFrom: a to: a on: $a.
       
    58     fsa addTransitionFrom: a to: b on: $b.	
       
    59 
       
    60     fsa name: #nextTokenAstarB.
       
    61     b retval: #AstarB.
       
    62 
       
    63     codeGenerator generate: fsa.
       
    64     codeGenerator generate: fsa copy.
       
    65     scanner := codeGenerator compile.
       
    66     
       
    67     self assert: scanner class methodDictionary size = 1.
       
    68     
       
    69     self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
       
    70     self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
       
    71     self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
       
    72 
       
    73     self fail: 'c' rule: #nextTokenAstarB.	
       
    74 !
       
    75 
       
    76 testDuplicities2
       
    77     | copy |
       
    78     fsa addState: a.
       
    79     fsa addState: b.
       
    80     fsa startState: a.
       
    81     fsa finalState: b.
       
    82     
       
    83     fsa addTransitionFrom: a to: a on: $a.
       
    84     fsa addTransitionFrom: a to: b on: $b.	
       
    85 
       
    86     b retval: nil.
       
    87     
       
    88     copy := fsa copy.
       
    89     copy name: #nextTokenFooBar.
       
    90     copy retval: #FooBar.
       
    91 
       
    92     fsa name: #nextTokenAstarB.
       
    93     fsa retval: #AstarB.
       
    94 
       
    95 
       
    96     codeGenerator generate: fsa.
       
    97     codeGenerator generate: copy.
       
    98     scanner := codeGenerator compile.
       
    99     
       
   100     self assert: scanner class methodDictionary size = 2.
       
   101     
       
   102     self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
       
   103     self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
       
   104     self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
       
   105 
       
   106     self fail: 'c' rule: #nextTokenAstarB.	
       
   107     
       
   108     self parse: 'ab' token: #FooBar rule: #nextTokenFooBar.
       
   109     self parse: 'b' token: #FooBar rule: #nextTokenFooBar.
       
   110     self parse: 'aaab' token: #FooBar rule: #nextTokenFooBar.
       
   111 
       
   112     self fail: 'c' rule: #nextTokenFooBar.	
       
   113 ! !
       
   114 
       
   115 !PPCScannerCodeGeneratorTest methodsFor:'tests'!
    45 
   116 
    46 testA
   117 testA
    47     fsa addState: a.
   118     fsa addState: a.
    48     fsa addState: b.
   119     fsa addState: b.
    49     
   120     
    52     
   123     
    53     fsa addTransitionFrom: a to: b on: $a.
   124     fsa addTransitionFrom: a to: b on: $a.
    54     fsa name: #nextTokenA.
   125     fsa name: #nextTokenA.
    55     b retval: #a.
   126     b retval: #a.
    56     
   127     
    57     scanner := (codeGenerator generate: fsa).
   128     scanner := (codeGenerator generateAndCompile: fsa).
    58     
   129     
    59     self parse: 'aaa' token: #a rule: #nextTokenA position: 1.
   130     self parse: 'aaa' token: #a rule: #nextTokenA position: 1.
    60     self fail: 'b' rule: #nextTokenA.	
   131     self fail: 'b' rule: #nextTokenA.	
    61 !
   132 !
    62 
   133 
    64     fsa addState: a.
   135     fsa addState: a.
    65     fsa addState: b.
   136     fsa addState: b.
    66     fsa addState: c.
   137     fsa addState: c.
    67     fsa startState: a.
   138     fsa startState: a.
    68     fsa finalState: b.
   139     fsa finalState: b.
       
   140     fsa finalState: c.
    69     
   141     
    70     fsa addTransitionFrom: a to: b on: $a.
   142     fsa addTransitionFrom: a to: b on: $a.
    71     fsa addTransitionFrom: b to: c on: $a.	
   143     fsa addTransitionFrom: b to: c on: $a.	
    72     fsa addTransitionFrom: c to: b on: $a.	
   144     fsa addTransitionFrom: c to: b on: $a.	
    73 
   145 
    74     fsa name: #nextTokenAAstarA.
   146     fsa name: #nextTokenAAstarA.
    75     b priority: -1.
       
    76     c priority: 0.
       
    77     b retval: #AAstarA.
   147     b retval: #AAstarA.
    78 
   148     c retval: #AAstarA.
    79     scanner := (codeGenerator generate: fsa).
   149     c final: true.
       
   150     c failure: true.
       
   151 
       
   152     scanner := (codeGenerator generateAndCompile: fsa).
    80 
   153 
    81     self parse: 'a' token: #AAstarA rule: #nextTokenAAstarA.
   154     self parse: 'a' token: #AAstarA rule: #nextTokenAAstarA.
    82     self parse: 'aaa' token: #AAstarA rule: #nextTokenAAstarA.
   155     self parse: 'aaa' token: #AAstarA rule: #nextTokenAAstarA.
    83     self parse: 'aaaaa' token: #AAstarA rule: #nextTokenAAstarA.
   156     self parse: 'aaaaa' token: #AAstarA rule: #nextTokenAAstarA.
    84 
   157 
    98     fsa addTransitionFrom: b to: c on: $b.	
   171     fsa addTransitionFrom: b to: c on: $b.	
    99     
   172     
   100     fsa name: #nextTokenAB.
   173     fsa name: #nextTokenAB.
   101     c retval: #ab.
   174     c retval: #ab.
   102     
   175     
   103     scanner := (codeGenerator generate: fsa).
   176     scanner := (codeGenerator generateAndCompile: fsa).
   104     
   177     
   105     self parse: 'ab' token: #ab rule: #nextTokenAB position: 2.
   178     self parse: 'ab' token: #ab rule: #nextTokenAB position: 2.
   106 !
   179 !
   107 
   180 
   108 testABorBC
   181 testABorBC
   124 
   197 
   125     fsa name: #nextTokenABorBC.
   198     fsa name: #nextTokenABorBC.
   126     c retval: #ab.
   199     c retval: #ab.
   127     e retval: #bc.
   200     e retval: #bc.
   128 
   201 
   129     scanner := (codeGenerator generate: fsa).
   202     scanner := (codeGenerator generateAndCompile: fsa).
   130 
   203 
   131     self parse: 'ab' token: #ab rule: #nextTokenABorBC position: 2.
   204     self parse: 'ab' token: #ab rule: #nextTokenABorBC position: 2.
   132     self parse: 'abbc' token: #ab rule: #nextTokenABorBC position: 2.
   205     self parse: 'abbc' token: #ab rule: #nextTokenABorBC position: 2.
   133     self parse: 'bc' token: #bc rule: #nextTokenABorBC position: 2.
   206     self parse: 'bc' token: #bc rule: #nextTokenABorBC position: 2.
   134     
   207     
   147     fsa addTransitionFrom: c to: b on: $a.	
   220     fsa addTransitionFrom: c to: b on: $a.	
   148 
   221 
   149     fsa name: #nextTokenABstarA.
   222     fsa name: #nextTokenABstarA.
   150     b retval: #ABstarA.
   223     b retval: #ABstarA.
   151 
   224 
   152     scanner := (codeGenerator generate: fsa).
   225     scanner := (codeGenerator generateAndCompile: fsa).
   153 
   226 
   154     self parse: 'a' token: #ABstarA rule: #nextTokenABstarA position: 1.
   227     self parse: 'a' token: #ABstarA rule: #nextTokenABstarA position: 1.
   155     self parse: 'aa' token: #ABstarA rule: #nextTokenABstarA position: 1.
   228     self parse: 'aa' token: #ABstarA rule: #nextTokenABstarA position: 1.
   156     self parse: 'aba' token: #ABstarA rule: #nextTokenABstarA position: 3.
   229     self parse: 'aba' token: #ABstarA rule: #nextTokenABstarA position: 3.
   157     self parse: 'abaa' token: #ABstarA rule: #nextTokenABstarA position: 3.
   230     self parse: 'abaa' token: #ABstarA rule: #nextTokenABstarA position: 3.
   160 
   233 
   161 
   234 
   162     self fail: '' rule: #nextTokenABstarA.
   235     self fail: '' rule: #nextTokenABstarA.
   163 !
   236 !
   164 
   237 
       
   238 testAStar
       
   239     fsa addState: a.
       
   240     fsa addState: b.
       
   241     
       
   242     fsa startState: a.
       
   243     fsa finalState: b.
       
   244     
       
   245     fsa addTransitionFrom: a to: a on: $a.
       
   246 
       
   247     fsa name: #nextTokenA.
       
   248     a retval: #a.
       
   249     a final: true.
       
   250     a priority: 0.
       
   251     
       
   252     scanner := (codeGenerator generateAndCompile: fsa).
       
   253     
       
   254     self assert: scanner class methodDictionary size == 1.
       
   255     
       
   256     self parse: '' token: #a rule: #nextTokenA.
       
   257     self parse: 'a' token: #a rule: #nextTokenA.
       
   258     self parse: 'aa' token: #a rule: #nextTokenA.
       
   259     self parse: 'ab' token: #a rule: #nextTokenA position: 1.
       
   260     self parse: 'aaa' token: #a rule: #nextTokenA.
       
   261     self parse: 'b' token: #a rule: #nextTokenA position: 0.
       
   262 !
       
   263 
   165 testA_Bstar_A
   264 testA_Bstar_A
   166     fsa addState: a.
   265     fsa addState: a.
   167     fsa addState: b.
   266     fsa addState: b.
   168     fsa addState: c.
   267     fsa addState: c.
   169     fsa startState: a.
   268     fsa startState: a.
   174     fsa addTransitionFrom: b to: c on: $a.	
   273     fsa addTransitionFrom: b to: c on: $a.	
   175 
   274 
   176     fsa name: #nextTokenA_Bstar_A.
   275     fsa name: #nextTokenA_Bstar_A.
   177     c retval: #A_Bstar_A.
   276     c retval: #A_Bstar_A.
   178 
   277 
   179     scanner := (codeGenerator generate: fsa).
   278     scanner := (codeGenerator generateAndCompile: fsa).
   180 
   279 
   181     self parse: 'aa' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
   280     self parse: 'aa' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
   182     self parse: 'aba' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
   281     self parse: 'aba' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
   183 
   282 
   184     self fail: '' rule: #nextTokenA_Bstar_A.
   283     self fail: '' rule: #nextTokenA_Bstar_A.
   198 
   297 
   199     fsa name: #nextTokenAorB.
   298     fsa name: #nextTokenAorB.
   200     b retval: #a.
   299     b retval: #a.
   201     c retval: #b.
   300     c retval: #b.
   202 
   301 
   203     scanner := (codeGenerator generate: fsa).
   302     scanner := (codeGenerator generateAndCompile: fsa).
   204 
   303 
   205     self parse: 'a' token: #a rule: #nextTokenAorB.
   304     self parse: 'a' token: #a rule: #nextTokenAorB.
   206     self parse: 'b' token: #b rule: #nextTokenAorB.	
   305     self parse: 'b' token: #b rule: #nextTokenAorB.	
   207 
   306 
   208     self fail: 'c' rule: #nextTokenAorB.	
   307     self fail: 'c' rule: #nextTokenAorB.	
   219     fsa addTransitionFrom: a to: b on: $a.	
   318     fsa addTransitionFrom: a to: b on: $a.	
   220 
   319 
   221     fsa name: #nextTokenAstarA.
   320     fsa name: #nextTokenAstarA.
   222     b retval: #AstarA.
   321     b retval: #AstarA.
   223 
   322 
   224     self should: [codeGenerator generate: fsa ] raise: Exception.
   323     self should: [codeGenerator generateAndCompile: fsa ] raise: Exception.
   225 !
   324 !
   226 
   325 
   227 testAstarB
   326 testAstarB
   228     fsa addState: a.
   327     fsa addState: a.
   229     fsa addState: b.
   328     fsa addState: b.
   234     fsa addTransitionFrom: a to: b on: $b.	
   333     fsa addTransitionFrom: a to: b on: $b.	
   235 
   334 
   236     fsa name: #nextTokenAstarB.
   335     fsa name: #nextTokenAstarB.
   237     b retval: #AstarB.
   336     b retval: #AstarB.
   238 
   337 
   239     scanner := (codeGenerator generate: fsa).
   338     scanner := (codeGenerator generateAndCompile: fsa).
   240     
   339     
   241     self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
   340     self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
   242     self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
   341     self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
   243     self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
   342     self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
   244 
   343