Changeset 20889
- Timestamp:
- 10/07/08 13:04:04 (2 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/python/dfareg/branches/codezine200809/dfareg/nfabuilder.py
r20885 r20889 2 2 # -*- coding: utf-8 -*- 3 3 import nfa 4 importcopy4 from copy import deepcopy 5 5 6 6 class NFAFragment(object): … … 36 36 self.start = None # should be set later 37 37 38 def new_state(self):39 state = self.context.generate_state()40 return state41 42 38 def connect(self, from_, char, to): 43 39 slot = self.map.setdefault( (from_, char), set() ) … … 48 44 raise Exception("can't merge other context fragment") 49 45 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() 55 47 for k, v in frag.map.iteritems(): 56 new_frag.map[k] = copy.copy(v)48 new_frag.map[k] = v.copy() 57 49 58 50 return new_frag … … 60 52 def new_skelton(self): 61 53 # コピーして返す 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) 64 56 return new_frag 65 57 66 58 def build(self): 59 map_ = self.map 67 60 def transition(state, char): 68 return frozenset( self.map.get( (state, char), []))61 return frozenset(map_.get( (state, char), [])) 69 62 70 63 return nfa.NondeterministicFiniteAutomaton( 71 64 transition, 72 65 self.start, 73 frozenset(self.accepts)66 self.accepts 74 67 ) 75 68 … … 82 75 return NFAFragment(self) 83 76 84 def generate_state(self):77 def new_state(self): 85 78 self._state_count += 1 86 79 return self._state_count … … 97 90 frag = frag1 | frag2 98 91 99 a = frag.new_state()92 a = context.new_state() 100 93 frag.connect(a, "", frag1.start) 101 94 frag.connect(a, "", frag2.start) … … 136 129 frag.connect(state, "", frag_orig.start) 137 130 138 a = frag.new_state()131 a = context.new_state() 139 132 frag.connect(a, "", frag_orig.start) 140 133 141 134 frag.start = a 142 frag.accepts = frag_orig.accepts | set([a])135 frag.accepts = frag_orig.accepts | frozenset([a]) 143 136 144 137 return frag … … 150 143 def assemble(self, context): 151 144 frag = context.new_fragment() 152 a = frag.new_state()153 b = frag.new_state()145 a = context.new_state() 146 b = context.new_state() 154 147 frag.connect(a, self.char, b) 155 148 156 149 frag.start = a 157 frag.accepts = set([b])150 frag.accepts = frozenset([b]) 158 151 159 152 return frag
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)