Updated to PetitCompiler-JanVrany.135, PetitCompiler-Tests-JanKurs.93, PetitCompiler-Extras-Tests-JanVrany.16, PetitCompiler-Benchmarks-JanKurs.12
Name: PetitCompiler-JanVrany.135
Author: JanVrany
Time: 22-07-2015, 06:53:29.127 PM
UUID: 890178b5-275d-46af-a2ad-1738998f07cb
Ancestors: PetitCompiler-JanVrany.134
Name: PetitCompiler-Tests-JanKurs.93
Author: JanKurs
Time: 20-07-2015, 11:30:10.283 PM
UUID: 6473e671-ad70-42ca-b6c3-654b78edc531
Ancestors: PetitCompiler-Tests-JanKurs.92
Name: PetitCompiler-Extras-Tests-JanVrany.16
Author: JanVrany
Time: 22-07-2015, 05:18:22.387 PM
UUID: 8f6f9129-dbba-49b1-9402-038470742f98
Ancestors: PetitCompiler-Extras-Tests-JanKurs.15
Name: PetitCompiler-Benchmarks-JanKurs.12
Author: JanKurs
Time: 06-07-2015, 02:10:06.901 PM
UUID: cb24f1ac-46a4-494d-9780-64576f0f0dba
Ancestors: PetitCompiler-Benchmarks-JanKurs.11, PetitCompiler-Benchmarks-JanVrany.e29bd90f388e.20150619081300
"{ Package: 'stx:goodies/petitparser/compiler/tests' }"
"{ NameSpace: Smalltalk }"
TestCase subclass:#PEGFsaScannerIntegrationTest
instanceVariableNames:'fsa fsaGenerator parser scanner result compiled'
classVariableNames:''
poolDictionaries:''
category:'PetitCompiler-Tests-Scanner'
!
!PEGFsaScannerIntegrationTest methodsFor:'as yet unclassified'!
compile
| ppcTree |
compiled ifTrue: [ ^ self ].
ppcTree := parser asCompilerTree.
fsa := ppcTree asFsa.
fsa name: #nextToken.
fsa finalStates do: [ :s | s isFailure ifFalse: [s retval: #token ]].
scanner := ((PPCScannerCodeGenerator new)
generate: fsa).
compiled := true
!
failScan: stream
self compile.
scanner initialize.
scanner stream: stream asPetitStream.
result := scanner nextToken.
self assert: result isEmpty
!
scan: stream token: token
self scan: stream token: token position: stream size.
!
scan: stream token: token position: position
self compile.
scanner initialize.
scanner stream: stream asPetitStream.
result := scanner nextToken.
self assert: result isCollection description: 'no collection returned as a result!!'.
self assert: (result isEmpty not) description: 'no token found'.
self assert: (result at: token) = position.
!
setUp
compiled := false.
fsaGenerator := PEGFsaGenerator new.
!
testA
parser := 'a' asParser.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'b'.
self scan: 'a' token: #token position: 1.
self scan: 'aaa' token: #token position: 1.
!
testAAA_Aplusnot
parser := 'aaa' asParser not, $a asParser plus.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self scan: 'a' token: #token.
self scan: 'aa' token: #token.
self failScan: ''.
self failScan: 'aaa'.
self failScan: 'aaaa'.
self failScan: 'aaaaa'.
!
testAAplus_A
parser := 'aa' asParser plus, $a asParser.
self scan: 'aaa' token: #token.
self scan: 'aaaaa' token: #token.
self failScan: 'a'.
self failScan: 'aa'.
self failScan: 'aaaa'.
!
testAAplus_B
parser := 'aa' asParser plus, $b asParser.
self scan: 'aab' token: #token.
self scan: 'aaaab' token: #token.
self failScan: 'ab'.
self failScan: 'aaab'.
self failScan: 'aac'.
!
testAAstar_A
parser := 'aa' asParser star, $a asParser.
self scan: 'a' token: #token.
self scan: 'aaa' token: #token.
self scan: 'aaaaa' token: #token.
self scan: 'aaaaaaa' token: #token.
self failScan: 'aa'.
self failScan: 'aaaa'.
!
testAAstar_B
parser := 'aa' asParser star, $b asParser.
self scan: 'b' token: #token.
self scan: 'aab' token: #token.
self scan: 'aaaab' token: #token.
self scan: 'aaaaaab' token: #token.
self failScan: 'ab'.
self failScan: 'aaa'.
!
testAB
parser := 'ab' asParser.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'b'.
self scan: 'ab' token: #token position: 2.
self scan: 'aba' token: #token position: 2.
!
testA_BCorCD_D
parser := $a asParser, ('bc' asParser / 'cd' asParser), $d asParser.
self scan: 'abcd' token: #token.
self scan: 'acdd' token: #token.
self failScan: 'abdd'.
self failScan: 'ad'.
self failScan: 'aacd'.
!
testA_BCorCDplus_D
parser := $a asParser, ('bc' asParser / 'cd' asParser) plus, $d asParser.
self scan: 'abcd' token: #token.
self scan: 'acdd' token: #token.
self scan: 'abcbccdd' token: #token.
self scan: 'acdcdbcbcd' token: #token.
self failScan: 'abdd'.
self failScan: 'ad'.
self failScan: 'abcccd'.
!
testA_BCorCDstar_D
parser := $a asParser, ('bc' asParser / 'cd' asParser) star, $d asParser.
self scan: 'ad' token: #token.
self scan: 'abcd' token: #token.
self scan: 'acdd' token: #token.
self scan: 'abcbccdd' token: #token.
self scan: 'acdcdbcbcd' token: #token.
self failScan: 'abdd'.
self failScan: 'abcccd'.
!
testA_Bnot
parser := 'a' asParser, $b asParser not.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: 'ab'.
self failScan: 'bb'.
self scan: 'a' token: #token position: 1.
self scan: 'ac' token: #token position: 1.
!
testA_Boptional
parser := $a asParser, $b asParser optional.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'b'.
self scan: 'ab' token: #token position: 2.
self scan: 'ac' token: #token position: 1.
self scan: 'a' token: #token position: 1.
!
testA_BorC_D
parser := $a asParser, ($b asParser / $c asParser), $d asParser.
self scan: 'abd' token: #token.
self scan: 'acd' token: #token.
self failScan: 'a'.
self failScan: 'abc'.
self failScan: 'add'.
!
testA_BorCplus_D
parser := $a asParser, ($b asParser / $c asParser) plus, $d asParser.
self scan: 'abd' token: #token.
self scan: 'acd' token: #token.
self scan: 'abcbcd' token: #token.
self scan: 'acbcbcd' token: #token.
self failScan: 'a'.
self failScan: 'ad'.
self failScan: 'abc'.
self failScan: 'aad'.
!
testA_BorCstar_D
parser := $a asParser, ($b asParser / $c asParser) star, $d asParser.
self scan: 'ad' token: #token.
self scan: 'abd' token: #token.
self scan: 'acd' token: #token.
self scan: 'abcbcd' token: #token.
self scan: 'acbcbcd' token: #token.
self failScan: 'a'.
self failScan: 'abc'.
self failScan: 'aad'.
!
testAorAA
parser := 'a' asParser / 'aa' asParser.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'b'.
self scan: 'aa' token: #token position: 1.
self scan: 'a' token: #token position: 1.
!
testAorAX_X
parser := ('a' asParser / 'ax' asParser), $x asParser.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self scan: 'ax' token: #token position: 2.
self scan: 'axx' token: #token position: 2.
self failScan: 'a'.
self failScan: 'x'.
self failScan: ''.
!
testAorB
parser := $a asParser / $b asParser.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'c'.
self scan: 'aa' token: #token position: 1.
self scan: 'bb' token: #token position: 1.
!
testAplus_B
parser := $a asParser plus, $b asParser.
self scan: 'ab' token: #token.
self scan: 'aab' token: #token.
self scan: 'aaab' token: #token.
self failScan: 'b'.
self failScan: 'ac'.
!
testAstar_A
parser := $a asParser star, $a asParser.
self failScan: 'a'.
self failScan: 'aa'.
self failScan: 'ac'.
!
testAstar_B
parser := $a asParser star, $b asParser.
self scan: 'b' token: #token.
self scan: 'ab' token: #token.
self scan: 'aab' token: #token.
self failScan: ''.
self failScan: 'ac'.
!
testAstar_Bnot
parser := 'a' asParser star, $b asParser not.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: 'aaab'.
self failScan: 'b'.
self scan: '' token: #token position: 0.
self scan: 'a' token: #token position: 1.
self scan: 'aac' token: #token position: 2.
self scan: 'aaaac' token: #token position: 4.
!
testFoo
parser := 'foo' asParser.
self scan: 'foo' token: #token.
self scan: 'foobar' token: #token position: 3.
self failScan: 'bar'.
self failScan: 'fo'.
!
testNumber
parser := #digit asParser plus.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self failScan: ''.
self failScan: 'b'.
self scan: '12' token: #token position: 2.
self scan: '2312' token: #token position: 4.
!
testSmalltalkIdentifier
parser := #letter asParser, #word asParser star, $: asParser not.
self compile.
self assert: fsa isDeterministic.
self assert: fsa isWithoutEpsilons.
self scan: 'a' token: #token.
self scan: 'hithere' token: #token.
self scan: 'hi123' token: #token.
self failScan: ''.
self failScan: 'aaa:'.
self failScan: '123'.
! !