1

問題是:EBNF遞歸

a。編寫名爲mp的直接遞歸EBNF規則,該規則描述了所有符合圓括號的符號:(),()()()()(()())((())())(()(()))()。它不應將(,())((()()視爲合法。 b。寫一個表格證明及其派生樹,顯示()(()())被認爲是合法的。

到目前爲止,我已經想到了一個合理的解決方案。我不確定它是否正確或者我錯過了什麼。

<mp> ::= "" | (<mp> "(" <mp> ")") 

有什麼建議嗎?

+0

本不屬於這裏,它屬於cs.stackexchange – pandorym

+0

我有兩個演習EBNF。應該將它們發佈到計算機科學或堆棧溢出可以嗎? – Vlad

+0

我很驚訝這個問題沒有結束;過去其他國際金融機構的問題已經關閉。除非你在做編碼工作,我認爲這些類型的問題屬於cs.stackexchange – pandorym

回答

1

但是,它關閉之前,這裏就是我想要有:

mp := (mp) mp 
mp := '' 

你的第二個例子,有n >= 0m >= 0不在BNF。但是你的第一個應該是可以接受的。

這裏是我的推導樹()(()())

mp 
(mp) mp 
('') mp 
()(mp) mp 
()(mp) '' 
()((mp) mp) 
()(('') mp) 
()(()(mp) mp) 
()(()(mp) '') 
()(()('')) 
()(()()) 
+0

我會把空字符串和規則放在一行中。 – Vlad

+1

我完全同意,爲了可讀性,我只將兩者分開。當你使用後來的編譯器概念時,讓每條生產規則都在自己的行上有價值。你明白它們具有相同的語義值?無論是在一行還是兩行? – pandorym

+0

嗯,我雖然每條規則必須在一行,緊湊。但現在我看到我可以保持兩條線。不知道。 – Vlad