compiler/PPCFSAVisitor.st
changeset 524 f6f68d32de73
child 532 132d7898a2a1
equal deleted inserted replaced
515:b5316ef15274 524:f6f68d32de73
       
     1 "{ Package: 'stx:goodies/petitparser/compiler' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 PPCNodeVisitor subclass:#PPCFSAVisitor
       
     6 	instanceVariableNames:'fsaCache idGen'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Visitors'
       
    10 !
       
    11 
       
    12 !PPCFSAVisitor methodsFor:'accessing'!
       
    13 
       
    14 idGen: anObject
       
    15     idGen := anObject
       
    16 ! !
       
    17 
       
    18 !PPCFSAVisitor methodsFor:'as yet unclassified'!
       
    19 
       
    20 unorderedChoiceFromFollowSet: followSet
       
    21     | followFsas  |
       
    22     
       
    23     ^ fsaCache at: followSet ifAbsentPut: [ 
       
    24         followFsas := followSet collect: [ :followNode | 
       
    25             followNode asFsa 
       
    26                 name: (idGen idFor: followNode);
       
    27                 retval: (idGen idFor: followNode); 
       
    28                 yourself
       
    29         ].
       
    30         self unorderedChoiceFromFsas: followFsas.
       
    31     ]
       
    32      
       
    33 !
       
    34 
       
    35 unorderedChoiceFromFsas: fsas
       
    36     | result startState |
       
    37     result := PEGFsa new.
       
    38     startState := PEGFsaState new.
       
    39     
       
    40     result addState: startState.
       
    41     result startState: startState.
       
    42 
       
    43     fsas do: [ :fsa | 
       
    44         result adopt: fsa.
       
    45         result addTransitionFrom: startState to: fsa startState.
       
    46     ].
       
    47 
       
    48     result determinizeStandard.
       
    49     ^ result
       
    50 !
       
    51 
       
    52 visitToken: tokenNode
       
    53     | anFsa |
       
    54 
       
    55     anFsa := tokenNode asFsa determinize.
       
    56     anFsa name: (idGen idFor: tokenNode).
       
    57     anFsa retval: (idGen idFor: tokenNode).
       
    58     
       
    59     tokenNode fsa: anFsa.
       
    60     ^ tokenNode
       
    61 !
       
    62 
       
    63 visitTokenConsumeNode: node
       
    64     | epsilon anFsa followSet |
       
    65     followSet := node followSetWithTokens.
       
    66     
       
    67     epsilon := followSet anySatisfy: [ :e | e acceptsEpsilon ].
       
    68     followSet := followSet reject: [ :e | e acceptsEpsilon ].
       
    69     epsilon ifTrue: [ followSet add: PPCEndOfFileNode instance ].
       
    70     
       
    71     anFsa := self unorderedChoiceFromFollowSet: followSet.
       
    72     anFsa name: 'nextToken_', (idGen idFor: node).
       
    73 
       
    74     node nextFsa: anFsa.
       
    75 !
       
    76 
       
    77 visitTokenNode: node
       
    78     ^ self visitToken: node
       
    79 !
       
    80 
       
    81 visitTokenizingParserNode: node
       
    82     "TODO JK: hack alert, change the handling of WS!!"
       
    83     self visitWhitespace: node whitespace.
       
    84 
       
    85     self visit: node tokens.
       
    86     self visit: node parser.
       
    87     ^ node
       
    88 !
       
    89 
       
    90 visitTrimmingTokenNode: node
       
    91     ^ self visitToken: node
       
    92 !
       
    93 
       
    94 visitWhitespace: node
       
    95     "JK HACK: treat ws as token -> create FSA for whitespace"
       
    96     | retval |
       
    97     retval := self visitToken: node.
       
    98     "we don't care about the finals of whitespace"
       
    99     node fsa removeFinals.
       
   100     ^ retval
       
   101 ! !
       
   102 
       
   103 !PPCFSAVisitor methodsFor:'initialization'!
       
   104 
       
   105 initialize
       
   106     super initialize.
       
   107     
       
   108     "for the given set of nodes, remember the unordered choice fsa
       
   109         see `unorderedChoiceFromFollowSet:`
       
   110     "
       
   111     fsaCache := Dictionary new.
       
   112 ! !
       
   113