
104
|
第 3 章
>> nfa = nfa_design.to_nfa(Set[2, 3])
=> #<struct NFA current_states=#<Set: {2, 3}>, accept_states=[3], rulebook=…>
>> nfa.read_character('b'); nfa.current_states
=> #<Set: {3, 1, 2}>
答案是狀態 1、2 或 3,這就如同我們在手動轉換過程所發現(請記住,
Set
裡的元素順
序並不重要)。
讓我們藉著建立
NFASimulation
類別,並將計算模擬物狀態如何因應某個特定輸入而有
所改變的方法提供給此類別,來使用這個想法。我們正將模擬物的狀態思考成 NFA 目
前可能的狀態組合(例如『1、2 或 3』),因此我們可以編寫 1 個需要模擬物狀態和字
元的
#next_state
方法,將該字元輸入到對應該狀態的 NFA,然後在之後檢閱 NFA 來
取回新的狀態:
class NFASimulation < Struct.new(:nfa_design)
def next_state(state, character)
nfa_design.to_nfa(state).tap { |nfa|
nfa.read_character(character)
}.current_states
end
end
這裡所討論的兩種狀態很容易讓人混淆。單一的模擬物狀態
(
NFASimulation#next_state
的
state ...