簡體   English   中英

從正則表達式生成圖靈機的算法

[英]Algorithm to generate a Turing Machine from a Regular Expression

我正在開發一個軟件來從正則表達式生成圖靈機。

[編輯:澄清一下,OP希望將正則表達式作為輸入,並以編程方式生成圖靈機來執行相同的任務。 OP 正在尋求執行正則表達式創建 TM 的任務,而不是使用正則表達式。 ]

首先我會解釋一下我做了什么,然后我的具體問題是什么:

我對正則表達式建模如下:

正則表達式(接口):下面的類實現了這個接口

簡單(即:“aaa”、“bbb”、“abcde”):這是一個葉類,它沒有任何子表達式

ComplexWithoutOr (ie: "a(ab)*","(a(ab) c(b) )*"):這個類包含一個正則表達式的列表。

ComplexWithOr (ie: "a(a|b) ","(a((ab) |c(b) ) "):這個類包含一個 Or 操作,其中包含一個正則表達式列表。它代表了“a|b " 第一個例子的一部分和第二個例子的 "(ab) |c(b) "。

變量(即:“awcw”,其中 w E {a,b}*):尚未實現,但其想法是將其建模為具有與 Simple 不同邏輯的葉類。 它代表示例的“w”部分。

理解並同意上述模型非常重要。 如果您有任何問題,請在繼續閱讀之前發表評論...

說到 MT 生成,我有不同程度的復雜性:

很簡單:這種表達方式已經在起作用了。 為每個字母生成一個新狀態並向右移動。 如果在任何狀態下,讀取的字母不是預期的,它會啟動一個“回滾電路”,以 MT 頭在初始位置結束並在非最終狀態停止。

ComplexWithoutOr:這是我的問題。 在這里,算法為每個子表達式生成一個 MT 並將它們連接起來。 這適用於一些簡單的情況,但我有回滾機制的問題。

這是一個不適用於我的算法的示例:

"(ab) abac":這是一個 ComplexWithoutOr 表達式,它包含一個 ComplexWithOr 表達式 "(ab) "(在 "ab" 中有一個 Simple 表達式)和一個 Simple 表達式 "abac"

我的算法首先為“ab”生成一個 MT1。 這個 MT1 被 MT2 用於“(ab)*”,所以如果 MT1 成功,它會再次進入 MT1,否則 MT1 回滾並且 MT2 正確完成。 換句話說,MT2 不會失敗。

然后,它為“abac”生成一個 MT3。 MT2的輸出是MT3的輸入。 MT3的輸出是執行的結果

現在,假設這個輸入字符串:“abac”。 如您所見,它與正則表達式匹配。 那么讓我們看看執行 MT 時會發生什么。

MT1 在第一次執行“ab”。 MT1 第二次 "ac" 失敗並回滾,將 MT 頭放在第三個位置 "a"。 MT2 正確完成,輸入被轉發到 MT3。 MT3 失敗,因為 "ac"!="abac"。 所以MT不識別“abac”。

你明白問題所在嗎? 你知道有什么解決辦法嗎?

我是用Java開發的,但是語言不重要,我想討論一下算法。

我並不完全清楚您究竟要實施什么。 看起來您想要制作一個圖靈機(或一般的任何 FSM),它只接受那些也被正則表達式接受的字符串。 實際上,您希望將正則表達式轉換為 FSM。

實際上,這正是真正的正則表達式匹配器在幕后所做的事情。 我認為 Russ Cox 的這一系列文章涵蓋了很多你想做的事情。

Michael Sipser 在 In Introduction to the Theory of Computation 中,在第 1 章證明了正則表達式在其描述能力上等同於有限自動機。 部分證明涉及構建一個非確定性有限自動機 (NDFA),它可以識別特定正則表達式所描述的語言。 我不打算復制那一章的一半,由於使用的符號,這會很困難,所以我建議你借用或購買這本書(或者使用這些術語的谷歌搜索可能會出現類似的證據)並使用它證明作為算法的基礎。

由於圖靈機可以模擬 NDFA,我假設生成 NDFA 的算法已經足夠好了。

在喬姆斯基層次結構中,正則表達式為 Level3,而 TM 為 Level1。 這意味着,TM 可以生成任何正則表達式,但反之則不然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM