AST (soyut sözdizimi ağacı) sahibiyim ve şimdi derleyicimi 2 veya daha fazla sayı vererek test etmek ve matematik işlemlerinin sonucu olan bir çıktıyı (hesap makinesi gibi) beklemek istiyorum.AST tercüman?
Sorum şu: Tercüman oluşturmanın en iyi yolu nedir? AST düğümlerinin ziyareti tekrarlayıcıdır, bu yüzden ağacın sonuna gelene kadar kapsüllenmiş hesaplamaların ne olduğunu bilmiyorum. Fakat bu yineleme ile yineleme yapıldığından, tüm işlemleri en sonunda nasıl yapabilirim? Bu tercümanın dikkat noktasını değiştirir, çünkü "git" dir yapmak can sıkıcı ne
int interpret(tree t)
{ /* left to right, top down scan of tree */
switch (t->nodetype) {
case NodeTypeInt:
return t->value;
case NodeTypeVariable:
return t->symbtable_entry->value
case NodeTypeAdd:
{ int leftvalue= interpret(t->leftchild);
int rightvalue= interpret(t->rightchild);
return leftvalue+rightvalue;
}
case NodeTypeMultiply:
{ int leftvalue= interpret(t->leftchild);
int rightvalue= interpret(t->rightchild);
return leftvalue*rightvalue;
}
...
case NodeTypeStatementSequence: // assuming a right-leaning tree
{ interpret(t->leftchild);
interpret(t->rightchild);
return 0;
}
case NodeTypeAssignment:
{ int right_value=interpret(t->rightchild);
assert: t->leftchild->Nodetype==NodeTypeVariable;
t->leftchild->symbtable_entry->value=right_value;
return right_value;
}
case NodeTypeCompareForEqual:
{ int leftvalue= interpret(t->leftchild);
int rightvalue= interpret(t->rightchild);
return leftvalue==rightvalue;
}
case NodeTypeIfThenElse
{ int condition=interpret(t->leftchild);
if (condition) interpret(t->secondchild);
else intepret(t->thirdchild);
return 0;
case NodeTypeWhile
{ int condition;
while (condition=interpret(t->leftchild))
interpret(t->rightchild);
return 0;
...
}
}
:
Bir AST var kez
İfadeler varsa ve bunlar arasında operatörleri karşılaştırırsanız nasıl yaparsınız? – Nitrate
CompareForEqual, Assignment, IfThenElse –
'u desteklemek için yorumlayıcıya düzeltme ekine bakın Çok teşekkürler Ira! – Nitrate