我假設這是理論上的,因爲它是作業,而不是你實際需要在這一點上編碼的東西。 (肯德里克的回答涵蓋了代碼方法)
基本思想是從你的BNF開始變量開始,並試圖找出如何擴展它,一次應用一個規則,看看你是否可以提出你的輸入序列。
對於像下面這樣的規則集:
(1) start: expression
(2) expression: expression '+' term
(3) | expression '-' term
(4) | term
(5) term: 'a'
(6) | 'b'
鑑於表達a + b - a
,你會去是這樣的:
一個。 start
(給出)
b。 expression
(1)
c。 expression '-' term
(3)
d。 expression '-' 'a'
(5)
e。 (2)
f。 (4)
g。 h。'a' '+' term '-' 'a'
(5)
h。所以這就是你如何做到這一步一次...現在的技巧是,你需要找出你所有的規則調用。所以,你真正的樹會是這個樣子:
start
| (b)
expression
/ | \ (c)
expression '-' term
/| \ (e) | (d)
expression '+' term 'a'
| (f) | (h)
term 'b'
| (g)
'a'
這是起初有點複雜,但一旦你真正看到它是如何做,這不是太硬回暖。
注意:有些人發現向後倒退比較容易,從輸入開始,然後反向應用規則以找到開始表達式。當你編寫一個解析器時,你將不可避免地需要在某個級別上遵循這條路線。
編輯:我列出了所有使用上述小寫字母的表達式步驟,然後顯示樹中的每組分支實際上與規則應用程序之一相對應。可能或不會幫助。
我對如何用一個遞歸規則構建* tree *節點感到困惑,像` :: = | `,除非使用標識符來指示遞歸。你能在教科書中找到任何例子嗎? –
2010-12-07 18:25:20
好的,編輯你想用肯德里克的答案。你有什麼問題? (按照他所說的順序,忽略你所說的你知道並且不知道的事情。) – 2010-12-07 20:06:42