--- 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.