compiler/PPCLL1Visitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 21 May 2015 14:12:22 +0100
changeset 464 f6d77fee9811
parent 459 4751c407bb40
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.118, PetitCompiler-Tests-JanKurs.46, PetitCompiler-Extras-Tests-JanKurs.11, and PetitCompiler-Benchmarks-JanKurs.11 Name: PetitCompiler-JanKurs.118 Author: JanKurs Time: 13-05-2015, 03:59:01.292 PM UUID: 4a8ccd94-3131-4cc7-9098-528f8e5ea0b5 Name: PetitCompiler-Tests-JanKurs.46 Author: JanKurs Time: 04-05-2015, 04:25:06.162 PM UUID: 9f4cf8b7-876e-4a13-9579-b833f016db66 Name: PetitCompiler-Extras-Tests-JanKurs.11 Author: JanKurs Time: 13-05-2015, 04:27:27.940 PM UUID: e9f30c31-fbd0-4e96-ad2a-868f88d20ea8 Name: PetitCompiler-Benchmarks-JanKurs.11 Author: JanKurs Time: 13-05-2015, 02:21:49.932 PM UUID: 6a23fd1e-a86f-46db-8221-cc41b778d32c

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

"{ NameSpace: Smalltalk }"

PPCRewritingVisitor subclass:#PPCLL1Visitor
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCLL1Visitor methodsFor:'as yet unclassified'!

isDeterministicChoice: node
    | firsts |
    firsts := OrderedCollection new.
    node children do: [ :child |
        (self startsWithToken: child) ifFalse: [ ^ false ].
        firsts addAll: child firstSetWithTokens.
    ].
    (firsts asIdentitySet size = firsts size) ifFalse: [ ^ false ].

    firsts do:[:e1 |
        firsts do:[:e2 |     
            e1 == e2 ifFalse: [
                (e1 overlapsWith: e2) ifTrue: [ ^ false ] ].
        ].
    ].
    ^ true

    "Modified: / 10-05-2015 / 07:27:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

startsWithToken: node
    | firstSet terminal total |
    total := 0.
    firstSet := node firstSetWithTokens.
        
    terminal := (firstSet detect: [ :e | e isTerminal ] ifNone: [ nil ]).
    terminal isNil ifFalse: [ ^ false ].
        
    ^ true
!

visitChoiceNode: node
    super visitChoiceNode: node.
    (self isDeterministicChoice: node) ifTrue: [ 
        self change.
        ^ PPCDeterministicChoiceNode new
            children: node children;
            name: node name;
            firstFollowCache: node firstFollowCache;
            yourself
    ].

    ^ node
! !