我正在爲我的編譯器類做一些預試練習,並且需要簡化這個正則表達式。簡化這個正則表達式
(a U b)*(a U e)b* U (a U b)*(b U e)a*
很明顯,e是空字符串,U代表聯合。
到目前爲止,我認爲其中一個(a U b)*可以被刪除,因爲U a = a的聯合。但是,我找不到任何其他的簡化,到目前爲止還沒有很好地解決其他問題。 :(
任何幫助表示讚賞,非常感謝!
我正在爲我的編譯器類做一些預試練習,並且需要簡化這個正則表達式。簡化這個正則表達式
(a U b)*(a U e)b* U (a U b)*(b U e)a*
很明顯,e是空字符串,U代表聯合。
到目前爲止,我認爲其中一個(a U b)*可以被刪除,因爲U a = a的聯合。但是,我找不到任何其他的簡化,到目前爲止還沒有很好地解決其他問題。 :(
任何幫助表示讚賞,非常感謝!
對正則表達式有點生疏,但如果仍然*表示 「零個或多個ocurrences」 你可以替換:
(a U e)b* for (a U b)*
離開第一部分有:
(a U b)*(a U b)* = (a U b)*
在右邊,你有
(b U e)a* = (b U a)*
現在,由於U形B = U A,你會得到:
(a U b)*(a U b)*
在右手邊,這讓剛剛
(a U b)* U (a U b)* = (a U b)*
我認爲這是它...
我認爲整件事是相當於(a U b)*
(或大多數正則表達式語法,(a|b)*
)
因爲我正在爲考試做練習題,所以我對你如何得出這個結論更感興趣。你能分享一下嗎? – CompilersBeginner 2011-02-10 01:57:14
這是我的推理:看看頂級聯盟的左側分支。首先,採取`(a U b)*(a U e)`;通過聯合分配串聯來獲得`(a U b)* a U(a U b)*`。第二部分是第一部分的超集,因此崩潰成'(a U b)*`。在末尾添加`b *`也是一樣的:任何與'(a U b)* b *`匹配的東西都會被'(a U b)*`匹配,反之亦然。這使得RE成爲(a U b)* U(a U b)*(b U e)a *`;由於右側只能接受`a`和`b`的字符串,它是左側的子集,所以RE簡化爲'(a U b)*`。 – 2011-02-10 02:02:41
@CompilersBeginner:兩種形式是等價的,如果匹配第一個意味着匹配第二個,匹配第二個意味着匹配第一個,對不對?你的表達從來不會引入除「a」和「b」之外的任何標記,因此與它匹配的任何東西都會匹配「(a U b)*」。並且任何'(a U b)*`都通過取第一個分支來匹配你,(a U b)*(a U e)b *`,然後選擇空串分支`(a U b)* eb * `,最後爲`b *`選擇重複計數0。 – 2011-02-10 02:03:51
首先TRAN石板的語言的英語描述:
(a U b)*(a U e)b* U (a U b)*(b U e)a*
轉換爲:
的a
秒或b
小號的任何序列,接着任選的a
,隨後通過任何數量的b
小號。
OR
任意數量的a
S和b
秒,然後通過一個可選的b
,任意數量的a
小號
follwed有很多重疊的位置 - 至少(a U b)*(a U e)
是與(a U b)*
完全相同,因爲「a
s和b
s的任何序列」必然以a
或ε(以任意字符串可以與小量結束),因此這些基團可被消除,留下
(a U b)*b* U (a U b)*a*
轉換爲:
的a
秒或b
小號的任何序列,隨後通過任何數量的b
小號。
OR
任何數量的a
S和b
S,通過任何數量的follwed a
小號
現在那些最外組的第一部分是相同的,所以允許塌陷那些成一個
(a U b)*(a* U b*)
翻譯爲:
任何序列的a
S或b
秒,然後通過任何數目的a
S或通過任何數量b
秒。
現在等一等,「由於和B的任何序列」 一定用「的a
小號任何序列或b
小號任何序列」,結束這意味着什麼,其匹配的第一個部分可以匹配整個正則表達式(因爲第二部分可以有一個長度爲零),所以我們爲什麼不只是使它
(a U b)*
ただ。簡單。
I'll給你我將如何解決這個問題的想法:(不是很正規,無擔保)
看主U的左側:
(U形B)* - 這是什麼意思?長度爲n的a和b的組合,其中n> = 0。
接下來是(U e)。我們有什麼在這裏?一個空的單詞。如果我們想要的話,我們可能已經在前一部分中獲得了它。如果我們想要e,那麼我們可以不管它。請注意,我們不需要一個a,因爲我們可以選擇e。所以我們可以跳過這整個部分。
接下來是什麼? B *。那是什麼?儘可能多的b's我們想要的。我們也可以在第一部分中獲得這些!我們可以離開!
所以左邊唯一的東西是(一個U b)*。
讓有右側一看:
確定這是很容易,現在,我們可以用同樣的想法,這只是不同的字母。
我們也會以同樣的方式得到(a U b)*。所以最後我們有(a U b)* U(a U b)*,你知道它等於(a U b)*。
我非常希望解釋任何答案,甚至提示而不是答案,我正在做考前練習,沒有解釋的答案對我來說幫不了多少忙!謝謝! – CompilersBeginner 2011-02-10 01:58:33
我相信我接受的答案是錯誤的,正如評論中指出的那樣。我確實認爲結果確實是(一個U b)*,但我的解釋並不正確。 – Piva 2011-02-10 02:46:38