Merged in PetitCompiler-JanVrany.170, PetitCompiler-Tests-JanKurs.116, PetitCompiler-Extras-Tests-JanKurs.29, PetitCompiler-Benchmarks-JanKurs.19
Name: PetitCompiler-JanVrany.170
Author: JanVrany
Time: 24-08-2015, 03:19:51.340 PM
UUID: c20a744f-3b41-4aaa-bb8a-71ce74a2a952
Name: PetitCompiler-Tests-JanKurs.116
Author: JanKurs
Time: 24-08-2015, 11:37:54.332 AM
UUID: 549e0927-358a-4a1b-8270-050ccfcb4217
Name: PetitCompiler-Extras-Tests-JanKurs.29
Author: JanKurs
Time: 24-08-2015, 11:36:52.503 AM
UUID: ea1dbb67-f884-4237-8f34-adb0677c0954
Name: PetitCompiler-Benchmarks-JanKurs.19
Author: JanKurs
Time: 24-08-2015, 11:48:47.045 AM
UUID: 1c342fdb-8ddd-4104-9c47-a8f589c51694
"{ Package: 'stx:goodies/petitparser/compiler' }"
"{ NameSpace: Smalltalk }"
PPCNodeVisitor subclass:#PPCFSAVisitor
instanceVariableNames:'fsaCache idGen'
classVariableNames:''
poolDictionaries:''
category:'PetitCompiler-Visitors'
!
!PPCFSAVisitor methodsFor:'accessing'!
idGen: anObject
idGen := anObject
! !
!PPCFSAVisitor methodsFor:'as yet unclassified'!
unorderedChoiceFromFollowSet: followSet
| followFsas |
^ fsaCache at: followSet ifAbsentPut: [
followFsas := followSet collect: [ :followNode |
followNode asFsa
name: (idGen idFor: followNode);
retval: (idGen idFor: followNode);
yourself
].
self unorderedChoiceFromFsas: followFsas.
]
!
unorderedChoiceFromFsas: fsas
| result startState |
result := PEGFsa new.
startState := PEGFsaState new.
result addState: startState.
result startState: startState.
fsas do: [ :fsa |
result adopt: fsa.
result addTransitionFrom: startState to: fsa startState.
].
result determinizeStandard.
^ result
!
visitToken: tokenNode
| anFsa |
anFsa := tokenNode asFsa determinize.
anFsa name: (idGen idFor: tokenNode).
anFsa retval: (idGen idFor: tokenNode).
tokenNode fsa: anFsa.
^ tokenNode
!
visitTokenConsumeNode: node
| epsilon anFsa followSet |
followSet := node followSetWithTokens.
epsilon := followSet anySatisfy: [ :e | e acceptsEpsilon ].
followSet := followSet reject: [ :e | e acceptsEpsilon ].
epsilon ifTrue: [ followSet add: PPCEndOfFileNode instance ].
anFsa := self unorderedChoiceFromFollowSet: followSet.
anFsa name: 'nextToken_', (idGen idFor: node).
node nextFsa: anFsa.
!
visitTokenNode: node
^ self visitToken: node
!
visitTokenizingParserNode: node
"TODO JK: hack alert, change the handling of WS!!"
self visitWhitespace: node whitespace.
self visit: node tokens.
self visit: node parser.
^ node
!
visitTrimmingTokenNode: node
^ self visitToken: node
!
visitWhitespace: node
"JK HACK: treat ws as token -> create FSA for whitespace"
| retval |
retval := self visitToken: node.
"we don't care about the finals of whitespace"
node fsa removeFinals.
^ retval
! !
!PPCFSAVisitor methodsFor:'initialization'!
initialize
super initialize.
"for the given set of nodes, remember the unordered choice fsa
see `unorderedChoiceFromFollowSet:`
"
fsaCache := Dictionary new.
! !