2012-05-11 18 views
6

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

cevap

14

tercümanlar, koda oldukça kolay ederiz. Goto veya işlev çağrılarını uygulamak için, etiket veya işlev bildirimi için ağacı aramak ve orada yürütmeye devam etmek gerekir. [Bu, ağacı önizleme ve bir arama tablosundaki tüm etiket konumlarını/işlev bildirimlerini toplayarak bunu hızlandırabilir. Bu bir derleyici oluşturmanın ilk adımıdır.] Bu bile yeterli değil; İşlev çağrılarında sakladığımız yineleme yığmasını ayarlamanız gerekecek, bu yüzden kolay değil. Bu kod, açıkça yönetilen bir yineleme yığınıyla yinelemeli bir döngüye dönüştürürse, yığının düzeltilmesi çok daha kolaydır.

+0

İfadeler varsa ve bunlar arasında operatörleri karşılaştırırsanız nasıl yaparsınız? – Nitrate

+0

CompareForEqual, Assignment, IfThenElse –

+0

'u desteklemek için yorumlayıcıya düzeltme ekine bakın Çok teşekkürler Ira! – Nitrate

İlgili konular