2014-05-03 34 views
4

我試圖找出如何基於給定的正則表達式來構建一個CFG(上下文無關文法)一個CFG。 例如,(AB)*(A | B) 我覺得這是一種算法穿過去,卻是讓人有些困惑。 這是我走到這一步:如何構建基於給定的正則表達式

S->aAB; 
    A->aAb|empty; 
    B->a|b; 

這是否正確? 任何幫助,將不勝感激。

+0

嗨,歡迎來到StackOverflow。這裏的問題一般都會包括一些關於你到目前爲止所嘗試的信息以及你所面臨的具體問題。這個問題更廣泛地要求一種通用算法,它可能在其他地方可以在網上找到。 – IMSoP

+0

請點擊問題下的編輯;不要試圖在評論中包含代碼。 – IMSoP

+0

對不起,這是我的第一篇文章,仍然試圖找出這個論壇是如何工作的。 – user3599855

回答

2

構建CFG三部分,每部分爲a(ab)*(a|b)

(a|b),你有B -> a | b權。

(ab)*將意味着像abababababab等字符串。所以A -> abA | empty將是正確的生產。

因此,完整的語法變爲:

S -> aAB 
A -> abA | empty 
B -> a | b 

注:A -> aAb | empty會得到像abaabbaaabbb等,這是不是一個regular language,而不可能代表regular expression字符串。

+0

非常感謝您的快速回復! – user3599855

+1

這個例子背後的理論就在這裏:(http://cs.stackexchange.com/a/62539/49540) –

3

的另一種方式構造的上下文無關文法對給定正則表達式是:

  1. 構建其接受的語言相同的正則表達式的有限狀態機。在狀態機的狀態,並且其具有的形式X -> t Y的用於每個狀態的規則:
  2. 創建一個語法其端子是那些在正則表達式的字母表,它的非端子(1到或對應1)在終端符號t上從狀態X轉換到狀態Y。如果您的CFG符號允許,每個最終狀態F都會得到一個形式爲F -> epsilon的規則。如果您的CFG符號不允許這樣的規則,則對於從狀態X至最終狀態F.每個轉變上端子t,產生規則X -> t(除了規則已經描述X -> t F)。其結果是常規的語法中,上下文無關文法的是服從每個右手側具有至多一個非末端的附加約束。

對於給出的例子,假設我們構建以下FSA(接受相同的語言正則表達式的很多):

FSA for language <code>a(ab)*(a|b)</code>

由此看來,這是簡單的推導以下常規語法:

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 

與其他方法相比,這種方法的缺點是所產生的語法是更詳細的比它需要的是,人和的優勢,該推導可以完全機械的,這意味着它更容易得到正確而不必努力思考。

+0

它應該是'A1 - > b B5'。謝謝。 –

+0

謝謝;現在錯誤已修復。 –