compiler/PEGFsaDeterminizator.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:#PEGFsaDeterminizator
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-FSA'
!

!PEGFsaDeterminizator methodsFor:'checking'!

checkPriorities
    self assert: ((fsa states select: [ :s | s hasPriority  ]) allSatisfy: [ :s | s priority == 0 ]).
    self assert: (fsa allTransitions allSatisfy: [ :s | s priority == 0 ]).
! !

!PEGFsaDeterminizator methodsFor:'determinization'!

determinize
    self checkPriorities.
    super determinize.	
! !

!PEGFsaDeterminizator methodsFor:'joining'!

joinInfo: info with: anotherInfo into: newInfo
    "nothing to do"
!

joinRetval: state with: anotherState into: newState
    "Different retvals cannot merge their info"

    state retvalsAndInfosDo: [:retval :info |
        retval isNil ifFalse: [ 
            newState addInfo: info for: retval.
        ]
    ].

    anotherState retvalsAndInfosDo: [:retval :info |
        retval isNil ifFalse: [ 
            self assert: (newState retvals includes: retval) not.
            newState addInfo: info for: retval.
        ]
    ].
!

joinState: state with: anotherState
    self assert: state hasZeroPriorityOnly.
    self assert: anotherState hasZeroPriorityOnly.
    
    ^ super joinState: state with: anotherState
!

joinTransitions: state with: anotherState into: newState
    newState transitions addAll: (state transitions collect: #copy).
    newState transitions addAll: (anotherState transitions collect: #copy).
    ^ self
! !