compiler/tests/PPCScannerCodeGeneratorTest.st
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
child 524 f6f68d32de73
--- a/compiler/tests/PPCScannerCodeGeneratorTest.st	Fri Jul 24 15:06:54 2015 +0100
+++ b/compiler/tests/PPCScannerCodeGeneratorTest.st	Mon Aug 17 12:13:16 2015 +0100
@@ -14,7 +14,9 @@
 fail: stream rule: rule 
     scanner initialize.
     scanner stream: stream asPetitStream. 
-    result := scanner perform: rule.
+    scanner perform: rule.
+    
+    result := scanner polyResult.
         
     self assert: result isEmpty
 !
@@ -26,7 +28,8 @@
 parse: stream token: token rule: rule position: position
     scanner initialize.
     scanner stream: stream asPetitStream. 
-    result := scanner perform: rule.
+    scanner perform: rule.
+    result := scanner polyResult.
         
     self assert: (result at: token) = position.
 !
@@ -41,8 +44,76 @@
     fsa := PEGFsa new.
     
     codeGenerator := PPCScannerCodeGenerator new.
+! !
+
+!PPCScannerCodeGeneratorTest methodsFor:'caching'!
+
+testDuplicities
+    fsa addState: a.
+    fsa addState: b.
+    fsa startState: a.
+    fsa finalState: b.
+    
+    fsa addTransitionFrom: a to: a on: $a.
+    fsa addTransitionFrom: a to: b on: $b.	
+
+    fsa name: #nextTokenAstarB.
+    b retval: #AstarB.
+
+    codeGenerator generate: fsa.
+    codeGenerator generate: fsa copy.
+    scanner := codeGenerator compile.
+    
+    self assert: scanner class methodDictionary size = 1.
+    
+    self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
+    self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
+    self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
+
+    self fail: 'c' rule: #nextTokenAstarB.	
 !
 
+testDuplicities2
+    | copy |
+    fsa addState: a.
+    fsa addState: b.
+    fsa startState: a.
+    fsa finalState: b.
+    
+    fsa addTransitionFrom: a to: a on: $a.
+    fsa addTransitionFrom: a to: b on: $b.	
+
+    b retval: nil.
+    
+    copy := fsa copy.
+    copy name: #nextTokenFooBar.
+    copy retval: #FooBar.
+
+    fsa name: #nextTokenAstarB.
+    fsa retval: #AstarB.
+
+
+    codeGenerator generate: fsa.
+    codeGenerator generate: copy.
+    scanner := codeGenerator compile.
+    
+    self assert: scanner class methodDictionary size = 2.
+    
+    self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
+    self parse: 'b' token: #AstarB rule: #nextTokenAstarB.
+    self parse: 'aaab' token: #AstarB rule: #nextTokenAstarB.
+
+    self fail: 'c' rule: #nextTokenAstarB.	
+    
+    self parse: 'ab' token: #FooBar rule: #nextTokenFooBar.
+    self parse: 'b' token: #FooBar rule: #nextTokenFooBar.
+    self parse: 'aaab' token: #FooBar rule: #nextTokenFooBar.
+
+    self fail: 'c' rule: #nextTokenFooBar.	
+! !
+
+!PPCScannerCodeGeneratorTest methodsFor:'tests'!
+
 testA
     fsa addState: a.
     fsa addState: b.
@@ -54,7 +125,7 @@
     fsa name: #nextTokenA.
     b retval: #a.
     
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
     
     self parse: 'aaa' token: #a rule: #nextTokenA position: 1.
     self fail: 'b' rule: #nextTokenA.	
@@ -66,17 +137,19 @@
     fsa addState: c.
     fsa startState: a.
     fsa finalState: b.
+    fsa finalState: c.
     
     fsa addTransitionFrom: a to: b on: $a.
     fsa addTransitionFrom: b to: c on: $a.	
     fsa addTransitionFrom: c to: b on: $a.	
 
     fsa name: #nextTokenAAstarA.
-    b priority: -1.
-    c priority: 0.
     b retval: #AAstarA.
+    c retval: #AAstarA.
+    c final: true.
+    c failure: true.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
 
     self parse: 'a' token: #AAstarA rule: #nextTokenAAstarA.
     self parse: 'aaa' token: #AAstarA rule: #nextTokenAAstarA.
@@ -100,7 +173,7 @@
     fsa name: #nextTokenAB.
     c retval: #ab.
     
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
     
     self parse: 'ab' token: #ab rule: #nextTokenAB position: 2.
 !
@@ -126,7 +199,7 @@
     c retval: #ab.
     e retval: #bc.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
 
     self parse: 'ab' token: #ab rule: #nextTokenABorBC position: 2.
     self parse: 'abbc' token: #ab rule: #nextTokenABorBC position: 2.
@@ -149,7 +222,7 @@
     fsa name: #nextTokenABstarA.
     b retval: #ABstarA.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
 
     self parse: 'a' token: #ABstarA rule: #nextTokenABstarA position: 1.
     self parse: 'aa' token: #ABstarA rule: #nextTokenABstarA position: 1.
@@ -162,6 +235,32 @@
     self fail: '' rule: #nextTokenABstarA.
 !
 
+testAStar
+    fsa addState: a.
+    fsa addState: b.
+    
+    fsa startState: a.
+    fsa finalState: b.
+    
+    fsa addTransitionFrom: a to: a on: $a.
+
+    fsa name: #nextTokenA.
+    a retval: #a.
+    a final: true.
+    a priority: 0.
+    
+    scanner := (codeGenerator generateAndCompile: fsa).
+    
+    self assert: scanner class methodDictionary size == 1.
+    
+    self parse: '' token: #a rule: #nextTokenA.
+    self parse: 'a' token: #a rule: #nextTokenA.
+    self parse: 'aa' token: #a rule: #nextTokenA.
+    self parse: 'ab' token: #a rule: #nextTokenA position: 1.
+    self parse: 'aaa' token: #a rule: #nextTokenA.
+    self parse: 'b' token: #a rule: #nextTokenA position: 0.
+!
+
 testA_Bstar_A
     fsa addState: a.
     fsa addState: b.
@@ -176,7 +275,7 @@
     fsa name: #nextTokenA_Bstar_A.
     c retval: #A_Bstar_A.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
 
     self parse: 'aa' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
     self parse: 'aba' token: #A_Bstar_A rule: #nextTokenA_Bstar_A.
@@ -200,7 +299,7 @@
     b retval: #a.
     c retval: #b.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
 
     self parse: 'a' token: #a rule: #nextTokenAorB.
     self parse: 'b' token: #b rule: #nextTokenAorB.	
@@ -221,7 +320,7 @@
     fsa name: #nextTokenAstarA.
     b retval: #AstarA.
 
-    self should: [codeGenerator generate: fsa ] raise: Exception.
+    self should: [codeGenerator generateAndCompile: fsa ] raise: Exception.
 !
 
 testAstarB
@@ -236,7 +335,7 @@
     fsa name: #nextTokenAstarB.
     b retval: #AstarB.
 
-    scanner := (codeGenerator generate: fsa).
+    scanner := (codeGenerator generateAndCompile: fsa).
     
     self parse: 'ab' token: #AstarB rule: #nextTokenAstarB.
     self parse: 'b' token: #AstarB rule: #nextTokenAstarB.