我試圖找出如何基於給定的正則表達式來構建一個CFG(上下文無關文法)一個CFG。 例如,(AB)*(A | B) 我覺得這是一種算法穿過去,卻是讓人有些困惑。 這是我走到這一步:如何構建基於給定的正則表達式
S->aAB;
A->aAb|empty;
B->a|b;
這是否正確? 任何幫助,將不勝感激。
我試圖找出如何基於給定的正則表達式來構建一個CFG(上下文無關文法)一個CFG。 例如,(AB)*(A | B) 我覺得這是一種算法穿過去,卻是讓人有些困惑。 這是我走到這一步:如何構建基於給定的正則表達式
S->aAB;
A->aAb|empty;
B->a|b;
這是否正確? 任何幫助,將不勝感激。
構建CFG三部分,每部分爲a
,(ab)*
和(a|b)
。
爲(a|b)
,你有B -> a | b
權。
(ab)*
將意味着像ab
,abab
,ababab
等字符串。所以A -> abA | empty
將是正確的生產。
因此,完整的語法變爲:
S -> aAB
A -> abA | empty
B -> a | b
注:A -> aAb | empty
會得到像ab
,aabb
,aaabbb
等,這是不是一個regular language,而不可能代表regular expression字符串。
非常感謝您的快速回復! – user3599855
這個例子背後的理論就在這裏:(http://cs.stackexchange.com/a/62539/49540) –
的另一種方式構造的上下文無關文法對給定正則表達式是:
X -> t Y
的用於每個狀態的規則:F -> epsilon
的規則。如果您的CFG符號不允許這樣的規則,則對於從狀態X至最終狀態F.每個轉變上端子t,產生規則X -> t
(除了規則已經描述X -> t F
)。其結果是常規的語法中,上下文無關文法的是服從每個右手側具有至多一個非末端的附加約束。對於給出的例子,假設我們構建以下FSA(接受相同的語言正則表達式的很多):
由此看來,這是簡單的推導以下常規語法:
S -> a A1
A1 -> a A2
A2 -> b B3
B3 -> a A2
B3 -> a A4
B3 -> b B5
A1 -> a A4
A1 -> b B5
A4 -> epsilon
B5 -> epsilon
epsilon ->
或者,如果我們不想用空右側規則,丟棄語法的最後三個規則,並添加:
A1 -> a
A1 -> b
B3 -> a
B3 -> b
與其他方法相比,這種方法的缺點是所產生的語法是更詳細的比它需要的是,人和的優勢,該推導可以完全機械的,這意味着它更容易得到正確而不必努力思考。
它應該是'A1 - > b B5'。謝謝。 –
謝謝;現在錯誤已修復。 –
嗨,歡迎來到StackOverflow。這裏的問題一般都會包括一些關於你到目前爲止所嘗試的信息以及你所面臨的具體問題。這個問題更廣泛地要求一種通用算法,它可能在其他地方可以在網上找到。 – IMSoP
請點擊問題下的編輯;不要試圖在評論中包含代碼。 – IMSoP
對不起,這是我的第一篇文章,仍然試圖找出這個論壇是如何工作的。 – user3599855