2011年6月22日 星期三

[regexp]實作遇到的問題

在單一state的實作裡,若想到辨別三位以上,尾巴是91的數字。
當寫出  [1-9]+91,卻是無法簡單對應實作出來。

image

遇到991的時候,我們會希望,當第一個9出現時,要移到state 9。
接下來就會辨別出來。
而9991的時候,第一個9出現時,不能移到state 9。
這個情況出現就是說明有模糊的地方出現,也就是state 1-9這裡,
兩個transition可以同時成立,而產生模糊。
把模糊消除的方法就是增加state,每個transition的成立條件是互斥。
 image

當場就複雜很多了。沒有模糊是單一state實作的重要前提。
但是,想從這個圖轉回去regexp,又寫不出來。
雖然意義相同,但是要轉換需要一番工夫。
看來,有了多state的實作,轉換工作可以少一點。
可是多state的實作,本身就難倒我了。

把實作與理論合起來看,單一state的實作,就是DFA (deterministic finite automaton),因為每一個state,在看到input進來的時候,
就必須要決定唯一一個的下一個state。
而NFA (nondeterministic finite automaton)則是可以有多個可能的下個state。
因此實作上得要記得所有的可能的state。並對那些state做input測試。

既然看到NFA是真的比較容易讓人腦了解,設計時也比較容易。
單一state的實作應該就到此結束,開始來做多state的實作吧。

沒有留言:

張貼留言