這是編譯器的練習。我們問,如果有可能,以配合正則表達式或上下文無關文法以下模式:這些模式可以通過正則表達式或上下文無關語法來匹配嗎?
- N「a」後跟N「B」,像「AABB」
- 迴文,像「abbccbba」
- N '一',則n 'b',則n 'C',像 '爲aabbcc'
注意,N可以是任何正整數。 (否則它太簡單了)
只有3個字符'abc'可以出現在文本中解析。
我很困惑,因爲據我所知,這些模式中的非模式可以用正則表達式和上下文無關文法來描述。
這是編譯器的練習。我們問,如果有可能,以配合正則表達式或上下文無關文法以下模式:這些模式可以通過正則表達式或上下文無關語法來匹配嗎?
注意,N可以是任何正整數。 (否則它太簡單了)
只有3個字符'abc'可以出現在文本中解析。
我很困惑,因爲據我所知,這些模式中的非模式可以用正則表達式和上下文無關文法來描述。
關鍵的問題是:有多少和什麼樣的內存你需要?
在問題1的情況下,您需要以某種方式跟蹤a
終端的數量,因爲您正在解析b
終端。既然你知道你需要一對一,堆棧顯然是足夠的(你可以把a
放在堆棧上,每彈出一個b
)。由於下推自動機相當於表現力的CFG,因此您可以爲問題1創建CFG。
對於問題2,PDA在問題1中使用的技術應該暗示您可以使用某種技術用於問題2.PDA可以構建輸入的前半部分的堆棧,然後在其反向進入時彈出它。
在問題3的情況下,如果使用堆棧技術來計數a
終端和b
終端,這一切都很好,但是堆棧內存發生了什麼變化?足夠了嗎?不,你需要在其他地方存儲a
的數量,所以CFG不能表達這種語法。
這裏有一個簡單的CFG的問題2(它證明了一個空的輸入,但你的想法)嘗試:
S -> a S a
S -> b S b
S -> c S c
S -> ɛ
如果使用兩個非終結符,可以修復:' S - > a T a,S - > b T b,S - > c T c,T - > S,T - >(空)' –
我以爲他的意思是'n'作爲一個變量。 a的數量爲n,然後是b的數量。否則,它會很容易。 –
那麼,我最初的想法是這需要一個解析器,而不是正則表達式。正則表達式是對這個,恕我直言,整理釘子的方法大錘。 (也許教授像我一樣:厭倦了看到正則表達式是第一個解決方案,而不是最後的手段/當它需要時使用*不是因爲它是*期望*) –