如何構造上下文無關文法?
01-14
L3 = {w1cw2cw3|w1,w2,w3 ∈ {a, b} and the number of a』s in w1 is equal to the
number of b』s in w2}.求L3的上下文無關文法。不需要答案,求大神指導一下解題方法。
先明確一下題意:應該是吧,要是的話枚舉一下語言的所有串就行了……
顯然在這裡沒什麼用,我們只需構造出,然後接上就行,也即:
,其中用於生成生成語言,用於生成,也即。然後分別構造和。先說(因為它簡單):其實是個正則文法,對應的正則表達式是,既然我們想要一個上下文無關文法,那就給它轉成左線性文法好了:。這一步構造是顯而易見的。
然後構造。首先要明確的一點是CFG的能力:可以對兩項進行計數和比較。這說明CFG是有能力構造出語言的。可是到底怎麼計數呢?方法就是給兩邊對稱地添加元素。先看三個例子:
(1)迴文串:(2)括弧配對:(3):這下明白了吧?要讓中的a和中的b個數相等,就要:每次給左邊添加一個a,就右邊添加一個b。不過考慮到中的b和中的a是不算數的,上面那句話可以改成:每次給左邊添加一個僅包含一個a的串,就在右邊添加一個僅包含一個b的串。
形式化地寫下來,就是:,其中是僅包含一個a的串,是僅包含一個b的串。至於怎麼構造就不講了吧,非常簡單,它們都是正則文法而已。當然,上面那個文法是有歧義的,要改成無歧義的好像還挺難=。=不過不要緊,它又沒讓你構造無歧義文法或者證明這個語言是固有歧義的【攤手】S1-&>A1S1B1|c
A1-&>A1a|A1ab|A1ba|E
B1-&>B1b|B1ba|B1ab|E
(E為空集)
S1是不是這樣構造的?
S2-&>S2a|S2b|E 我覺得S2應該可以生成空集吧
推薦閱讀:
※現代C++編譯器是否會根據debug期間運行所得的信息來進行優化?
※有沒有介紹LLVM的書籍可以推薦?最好是中文的
※計算機是怎麼區分int類型和float類型的數據的?
※編譯器為什麼在一次編譯過程中要儘可能的發現所有錯誤?
※你覺得編譯程序中使用的關鍵技術都有哪些應用方向?請詳細說明。