Changeset 20885

Show
Ignore:
Timestamp:
10/07/08 12:51:33 (6 weeks ago)
Author:
hiratara
Message:

マージは最低限の処理だけやるように修正。
元のFragmentを壊さないようにコピー化

Files:
1 modified

Legend:

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

    r20867 r20885  
    22# -*- coding: utf-8 -*- 
    33import nfa 
     4import copy 
    45 
    56class NFAFragment(object): 
     
    3132    def __init__(self, context): 
    3233        self.context = context 
    33         self.accepts = set() 
    3434        self.map     = dict() 
     35        self.accepts = None  # should be set later 
    3536        self.start   = None  # should be set later 
    3637 
     
    4849 
    4950        new_frag = self.context.new_fragment() 
    50         new_frag.accepts = self.accepts.union(frag.accepts) 
     51 
    5152        new_frag.map     = dict() 
    5253        for k, v in self.map.iteritems(): 
    53             new_frag.map[k] = v 
     54            new_frag.map[k] = copy.copy(v) 
    5455        for k, v in frag.map.iteritems(): 
    55             new_frag.map[k] = v 
     56            new_frag.map[k] = copy.copy(v) 
    5657 
     58        return new_frag 
     59 
     60    def new_skelton(self): 
     61        # コピーして返す 
     62        new_frag = self.context.new_fragment() 
     63        new_frag.map = copy.deepcopy(self.map) 
    5764        return new_frag 
    5865 
     
    93100        frag.connect(a, "", frag1.start) 
    94101        frag.connect(a, "", frag2.start) 
     102 
    95103        frag.start = a 
     104        frag.accepts = frag1.accepts | frag2.accepts 
    96105 
    97106        return frag 
     
    110119        for state in frag1.accepts: 
    111120            frag.connect(state, "", frag2.start) 
    112             frag.accepts.remove(state) 
    113121 
    114         frag.start = frag1.start 
     122        frag.start   = frag1.start 
     123        frag.accepts = frag2.accepts 
    115124 
    116125        return frag 
     
    121130 
    122131    def assemble(self, context): 
    123         frag = self.operand.assemble(context) 
    124         for state in frag.accepts: 
    125             frag.connect(state, "", frag.start) 
     132        frag_orig = self.operand.assemble(context) 
     133        frag = frag_orig.new_skelton() 
     134 
     135        for state in frag_orig.accepts: 
     136            frag.connect(state, "", frag_orig.start) 
    126137 
    127138        a = frag.new_state() 
    128         frag.accepts.add(a) 
    129         frag.connect(a, "", frag.start) 
     139        frag.connect(a, "", frag_orig.start) 
    130140 
    131141        frag.start = a 
     142        frag.accepts = frag_orig.accepts | set([a]) 
    132143 
    133144        return frag 
     
    142153        b = frag.new_state() 
    143154        frag.connect(a, self.char, b) 
    144         frag.accepts.add(b) 
     155 
    145156        frag.start = a 
     157        frag.accepts = set([b]) 
     158 
    146159        return frag 
    147160