[英]converting context free grammar into regular expression
我目前正在查看 CFG 並看到了答案,但我不確定他們是如何得到的。 他們是如何把它從 CFG 轉換成正則表達式的?
S -> aS|bX|a
X -> aX|bY|a
Y -> aY|a
answer:
R.E -> (a*(a+ba*a+ba*ba*a))
您應該學習我在回答“從正則表達式構建等效的正則語法”中所寫的基本規則,這些規則將幫助您將“正則表達式轉換為右或左線性語法”或“右或左線性”語法轉換成正則表達式” - 兩者。
但是,一種語言可以有多個正則表達式(和語法/自動機)。 下面,我試圖解釋如何在你的教科書中找到答案中給出的正則表達式。 准確閱讀每個步驟並鏈接答案,以便您下次可以學習自己解決此類問題的方法。
第一步,要回答這樣的問題,你應該清楚“這個語法產生了什么語言?” (同樣,如果您有自動機,則嘗試理解該自動機表示的語言)。
正如我在鏈接答案中所說,語法規則如下: S → eS | e
S → eS | e
對應於“plus clouser”並生成字符串e +
。 同樣,您有三對這樣的規則來在您的語法中生成a +
。
S → aS | a
X → aX | a
Y → aY | a
(注意: a +
也可以寫成a * a
或aa *
– 描述一個或多個'a'
。)
另請注意,在語法中,您沒有任何“空產生式”,例如A → ∧
,因此非變量S
、 X
或Y
可以為空,這意味着空字符串不是語法語言的成員,如: ε ∉ L(G)。
如果您注意到 start-variable 的S
產生式規則:
S → aS | bX | a
那么很明顯,語言中的字符串 ω 可以以符號'a'
或以'b'
開頭(因為您有兩種選擇來應用S
產生式,要么 (1) S → aS | a
給出'a'
作為第一個ω 中的符號,或 (2) S → bX
用於生成以符號'b'
開頭的字符串)。
現在,L(G) 中可能的最小長度字符串 ω 是多少? – 最小長度字符串是"a"
,可以使用產生式規則: S → a
。
接下來需要注意的是"b"
∉L(G),因為如果蘋果S → bX
再后來就必須更換X
在句型bX
使用一些X
的生產規則,因為我們知道X
也不能為空,因此有將總是后一些符號(一個或多個) 'b'
-換句話說從感傷bX
導出|ω|≥2。
從上面的討論中可以看出,很明顯,使用S
產生式規則,您可以分兩步生成a*a
或a*bX
句子形式:
對於a*
重復使用S → aS
將得到S ⇝ a*S
(符號 ⇝ 表示不止一步)
將S
S ⇝ a*S
rhs 中的S ⇝ a*S
a*a
或a*bX
此外,如果您想將完整的表達式✎括起來,“ a*a
或a*bX
”可以寫成S ⇝ a*(a + bX)
S ⇝ (a*(a + bX))
S ⇝ a*(a + bX)
或S ⇝ (a*(a + bX))
。
現在比較S
和X
產生規則都一樣! 因此,正如我上面對S
所示,您還可以描述X
可用於生成句子形式X ⇝ (a*(a + bY))
。
要導出答案中給出的正則表達式,將X
替換為(a*(a + bY))
S ⇝ a*(a + bX)
(a*(a + bY))
in S ⇝ a*(a + bX)
,您將得到:
S ⇝ a*(a + b X )
S ⇝ a*(a + b (a*(a + bY)) )
現在,最后的Y
產生式規則相對來說非常簡單 - 只需用於創建“plus clouser” a +
(或a*a
)。
所以讓我們也用S
派生句形式替換Y
S ⇝ a*(a + b(a*(a + bY)))
⇝ a*(a + b(a*(a + ba*a)))
簡化它,應用低分布兩次以去除內括號並連接正則表達式 - P(Q + R)
可以寫為PQ + PR
。 ✞
⇝ a*(a + b(a*(a + ba*a)))
⇝ a*(a + b(a*a + a*ba*a))
⇝ a*(a + ba*a + ba*ba*a)
✎ : + 在正式語言的正則表達式中使用兩種語法 (i) + 作為二元運算符的意思是 – “聯合運算” (ii) + 作為一元上標運算符的意思是 – “plus clouser”
✎ :在編程語言中的正則表達式中 + 僅用於“plus clouser”
✞ :在正則表達式中,我們使用 ∣ 符號表示並集,但這不完全是聯合運算符。 在聯合中 (A ∪ B) 與 (B ∪ A) 相同,但在正則表達式中 (A ∣ B) 可能不等於 (B ∣ A)
您可以從問題中觀察到,除了作為 CFG 之外,語法也是正確的線性。 所以你可以為這個正確的線性文法構造一個有限自動機。 現在您已經構建了有限自動機,它們存在一個使用相同語言的正則表達式,並且可以使用本站點中給出的步驟完成轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.