1

我正在研究解釋器,並沒有找到如何在語義分析之後遍歷和抽象語法樹的很好的解釋。我想知道正確的方法是什麼。我知道你將終端合併到他們的父母處理從左到右,並儘可能地重複這一點。解釋器後端,你如何遍歷你的抽象語法樹?

我有這個抽象的語法樹,它可能是也可能不是正確的。

ast http://theadesilva.com/so_1.jpg

我該怎麼辦?

將34和3合併成*,然後將4和*合併到+中,然後將ident合併到call和+中以調用?是對的嗎?像這樣向後遍歷一棵樹的好算法是什麼?

+0

爲什麼你要做一個直接的AST interp而不是把它轉化成合理的東西(比如平面堆棧VM字節碼)? –

回答

1

我不會像你那樣構建AST。我將查看print作爲一個參數的函數。因此,我將建設成爲

print 
    \ 
     + 
    / \ 
    4  * 
    / \ 
     3  34 

你走在樹樹,你在根應用操作/功能給孩子之前評估的兒童。沒有規定說你只能有兩個孩子。如果你需要幾個,你可以有幾個孩子。

即樂趣(A,B,C,d)

fun 
// \ \ 
a b c d 

或沒有孩子

即currentTime的()

currentTime 

所以我AST你的問題將是

visit            
print   need to evaluate right child 
+    left is 4, need to evaluate right 
*    left is 3, right is 34 
       evaluate 3 * 34 and return right = 102 
       evaluate 4 + 102 and return right = 106 
       evaluate print, so print 106 
+0

相對而言,PRINT number *應該是一個函數。沒有必要將它連接到基本語言(他可能必須在語言中寫入「PRINTCHARACTER」或「PRINTSTRING」,但PRINT號碼應該是生成數字字符串然後調用原語打印的東西)。我會按照OP的方式構建樹。這並沒有真正改變答案,除了它增加了一個額外的步驟:在對算術進行評估之後,他「調用(print,106)」並執行他的解釋器步驟以進行「調用」,該步驟找到了打印(某處)並開始評估。 –