2015-11-05 35 views
6

我目前正在學習語法分析。我試圖做一個metagrammar可能產生特定的語法:如何創建一個metagrammar?

A ⇒ A '+' C | C ; 
C ⇒ C * Q ; 
C ⇒ Q ; 
Q ⇒ a | b | 'A' | "B" | "(" A ")" | <num> ; 
<num> ⇒ <Signed Int> | Float ; 
<Signed Int> ⇒ Signe Int ; 
Signe ⇒ '-' | '+' | ~eps~ 
<Int> ⇒ Digit Int | Digit ; 
Digit ⇒ '1' | '2' | '3' | '4' | 5 | 6 | 7 | 8 | "9" | "0" ; 
Float ⇒ Int '.' Int ; 

<>被忽略(即<int>是一樣的int),單/雙引號是一個字符串,~eps~是小量。其他一切都被視爲符號(無論是終端還是非終端)。

目前,我有這樣的事情:

S ⇒ left "⇒" right ";" | ε 
left ⇒ symb | "<"symb">" 
right ⇒ QP 
Q ⇒ symb | """symb""" | "'"symb"'" | "<"symb">" | ε 
P ⇒ symb | '|' Q | ε 

但感覺這樣我錯了,我沒有什麼做的那麼肯定。有沒有確定metagrammar的方法?我怎麼能去談論這個呢?

+0

如果在'Signe'結尾處有';'⇒' - '| '+'| 〜每股收益〜'? – 2015-11-10 14:58:10

回答

2

不錯的開始。你真的應該定義symb:

letter = "A" | "B" | ... | "Z" ; 
symb = letter symb | letter ; 

但是你的metagrammar只允許一個語法規則。 要允許多個規則,我想你想寫:

S = R S | ε ; 
R = left "⇒" right ";" 

你可能會在使用metagrammars處理自己和其他語法工具非常感興趣。這篇關於MetaII的小文章,從(ready?)討論了這個問題,並展示瞭如何構建使用它的編譯器。這是一篇令人驚歎的論文,它會扭曲你的大腦(很好的方式!)

當你完成這篇論文後,你會感覺非常適合的metagrammars。 (我在20世紀70年代早期學會了使用這種編譯器)。