Changeset 20889

Show
Ignore:
Timestamp:
10/07/08 13:04:04 (2 months ago)
Author:
hiratara
Message:

stateをFragmentに属さない概念として再構築
acceptsはイミュータブルに変更

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/python/dfareg/branches/codezine200809/dfareg/nfabuilder.py

    r20885 r20889  
    22# -*- coding: utf-8 -*- 
    33import nfa 
    4 import copy 
     4from copy import deepcopy 
    55 
    66class NFAFragment(object): 
     
    3636        self.start   = None  # should be set later 
    3737 
    38     def new_state(self): 
    39         state = self.context.generate_state() 
    40         return state 
    41  
    4238    def connect(self, from_, char, to): 
    4339        slot = self.map.setdefault( (from_, char), set() ) 
     
    4844            raise Exception("can't merge other context fragment") 
    4945 
    50         new_frag = self.context.new_fragment() 
    51  
    52         new_frag.map     = dict() 
    53         for k, v in self.map.iteritems(): 
    54             new_frag.map[k] = copy.copy(v) 
     46        new_frag = self.new_skelton() 
    5547        for k, v in frag.map.iteritems(): 
    56             new_frag.map[k] = copy.copy(v) 
     48            new_frag.map[k] = v.copy() 
    5749 
    5850        return new_frag 
     
    6052    def new_skelton(self): 
    6153        # コピーして返す 
    62         new_frag = self.context.new_fragment() 
    63         new_frag.map = copy.deepcopy(self.map) 
     54        new_frag = NFAFragment(self.context) 
     55        new_frag.map = deepcopy(self.map) 
    6456        return new_frag 
    6557 
    6658    def build(self): 
     59        map_ = self.map 
    6760        def transition(state, char): 
    68             return frozenset(self.map.get( (state, char), [])) 
     61            return frozenset(map_.get( (state, char), [])) 
    6962 
    7063        return nfa.NondeterministicFiniteAutomaton( 
    7164            transition, 
    7265            self.start, 
    73             frozenset(self.accepts) 
     66            self.accepts 
    7467            ) 
    7568 
     
    8275        return NFAFragment(self) 
    8376 
    84     def generate_state(self): 
     77    def new_state(self): 
    8578        self._state_count += 1 
    8679        return self._state_count 
     
    9790        frag = frag1 | frag2 
    9891 
    99         a = frag.new_state() 
     92        a = context.new_state() 
    10093        frag.connect(a, "", frag1.start) 
    10194        frag.connect(a, "", frag2.start) 
     
    136129            frag.connect(state, "", frag_orig.start) 
    137130 
    138         a = frag.new_state() 
     131        a = context.new_state() 
    139132        frag.connect(a, "", frag_orig.start) 
    140133 
    141134        frag.start = a 
    142         frag.accepts = frag_orig.accepts | set([a]) 
     135        frag.accepts = frag_orig.accepts | frozenset([a]) 
    143136 
    144137        return frag 
     
    150143    def assemble(self, context): 
    151144        frag = context.new_fragment() 
    152         a = frag.new_state() 
    153         b = frag.new_state() 
     145        a = context.new_state() 
     146        b = context.new_state() 
    154147        frag.connect(a, self.char, b) 
    155148 
    156149        frag.start = a 
    157         frag.accepts = set([b]) 
     150        frag.accepts = frozenset([b]) 
    158151 
    159152        return frag