有許多不同的算法。
備選方案1:您可以將AST編譯爲更線性的中間表示形式。您的代碼可以編譯爲以下內容:
a <- 3 * 2
b <- 5/2
c <- a - b
d <- 2 * 4
e <- c + d
return e
這很容易評估,因爲它只是一系列指令。大多數指令具有相同的格式:X <- Y OP Z
,因此評估者將非常簡單。
備選方案2:您可以將備選#1編譯爲機器碼或字節碼。
li r3, 3
muli r3, 2
li r4, 5
divi r4, r5, 2
subf r3, r3, r4
li r4, 2
muli r4, r4, 4
add r3, r3, r4
blr
方案3:您可以編譯替代#1到名爲SSA,或「單靜態分配」的一種特殊形式,它類似於#1,但每一項任務的LHS是獨一無二的,特殊的「 phi「節點用於組合來自不同分支的值。然後可以將SSA編譯爲機器碼或字節碼。
方案4:您可以通過遞歸下降來評估AST。大多數關於Scheme/Lisp的書籍都對此進行了全面的介紹。
備選5:您可以使用遞歸下降將代碼轉換爲堆棧機器代碼,然後對其進行評估。喜歡的東西:
push 3
push 2
mul
push 5
push 2
div
sub
push 2
push 4
mul
add
ret
替代∞:有大量的其他技術。寫在這個問題上的書是厚。