compiler/PEGFsaSequenceDeterminizator.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Aug 2015 12:13:16 +0100
changeset 515 b5316ef15274
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.160, PetitCompiler-Tests-JanKurs.112, PetitCompiler-Extras-Tests-JanKurs.25, PetitCompiler-Benchmarks-JanKurs.17 Name: PetitCompiler-JanKurs.160 Author: JanKurs Time: 17-08-2015, 09:52:26.291 AM UUID: 3b4bfc98-8098-4951-af83-a59e2585b121 Name: PetitCompiler-Tests-JanKurs.112 Author: JanKurs Time: 16-08-2015, 05:00:32.936 PM UUID: 85613d47-08f3-406f-9823-9cdab451e805 Name: PetitCompiler-Extras-Tests-JanKurs.25 Author: JanKurs Time: 16-08-2015, 05:00:10.328 PM UUID: 09731810-51a1-4151-8d3a-56b636fbd1f7 Name: PetitCompiler-Benchmarks-JanKurs.17 Author: JanKurs Time: 05-08-2015, 05:29:32.407 PM UUID: e544b5f1-bcf8-470b-93a6-d2363e4dfc8a

"{ Package: 'stx:goodies/petitparser/compiler' }"

"{ NameSpace: Smalltalk }"

PEGFsaAbstractDeterminizator subclass:#PEGFsaSequenceDeterminizator
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-FSA'
!

!PEGFsaSequenceDeterminizator methodsFor:'determinization'!

determinize
    super determinize.

    self markFailures.
    fsa removePriorities.
!

markFailures
    fsa finalStates do: [ :fs |
        | priority |
        priority := fs priority.
        fs reachableStates do: [ :rs |
            (rs hasPriority and: [ (rs priority > fs priority) and: [ rs isFinal not ] ]) ifTrue: [ 
                rs failure: true.
                rs final: true.
            ]
        ]
    ]
! !

!PEGFsaSequenceDeterminizator methodsFor:'joining'!

joinInfo: info with: anotherInfo into: newInfo
    (info hasEqualPriorityTo: anotherInfo) ifTrue: [ 
        newInfo final: (info isFinal or: [ anotherInfo isFinal ]).
        newInfo priority: info priority.	
        ^ self
    ].
    
    (info hasHigherPriorityThan: anotherInfo) ifTrue: [ 
 		newInfo priority: info priority.	
        newInfo failure: info isFsaFailure.
        newInfo final: info isFinal.
        ^ self
    ].

    newInfo priority: anotherInfo priority.
    newInfo failure: anotherInfo isFsaFailure.
    newInfo final: anotherInfo isFinal.
!

joinRetval: state with: anotherState into: newState
    "Different retvals cannot merge their info"
    self assert: (state hasDifferentRetvalThan: anotherState) not. 
    self assert: state retval == anotherState retval.
    
    newState retval: state retval.
!

joinState: state with: anotherState
    self assert: state isMultivalue not.
    self assert: anotherState isMultivalue not.
    
    ^ super joinState: state with: anotherState
!

joinTransitions: state with: anotherState into: newState
    self assert: newState isMultivalue not.
    
    newState hasPriority ifFalse: [ 
        newState transitions addAll: (state transitions collect: #copy).
        newState transitions addAll: (anotherState transitions collect: #copy).
        ^ self
    ].
    
    self assert: newState hasPriority.
    "This is a part when low priority branches are cut-out"
    (state priority == newState priority) ifTrue: [ 
        newState transitions addAll: (state transitions collect: #copy).
    ] ifFalse: [
        newState transitions addAll: (state transitions select: [ :t | t priority > newState priority ] thenCollect: #copy)
    ].

    (anotherState priority == newState priority) ifTrue: [ 
        newState transitions addAll: (anotherState transitions collect: #copy).
    ] ifFalse: [
        newState transitions addAll: (anotherState transitions select: [ :t | t priority > newState priority ] thenCollect: #copy)
    ].

    newState mergeTransitions.
! !