Öğrenme amaçlı yaptığım kendi programlama dilimi oluşturma sürecindeyim. Dilimi alt kümesi için lexer ve özyinelemeli iniş ayrıştırıcıyı zaten yazdım (şu anda + - * /
parantez gibi matematiksel ifadeleri destekliyorum ). Ayrıştırıcı bana Evaluate
, ifadenin sonucunu elde etmek için yöntemi çağıracağım bir Soyut Sözdizimi Ağacı'nı geri verir. Her şey iyi çalışıyor. Yaklaşık olarak şu anki durumum (C # 'daki kod örnekleri, ancak bu oldukça fazla dil-agnostiği olmasına rağmen):
public abstract class Node
{
public abstract Double Evaluate();
}
public class OperationNode : Node
{
public Node Left { get; set; }
private String Operator { get; set; }
private Node Right { get; set; }
public Double Evaluate()
{
if (Operator == "+")
return Left.Evaluate() + Right.Evaluate();
//Same logic for the other operators
}
}
public class NumberNode : Node
{
public Double Value { get; set; }
public Double Evaluate()
{
return Value;
}
}
Bununla birlikte, algoritmayı ağaç düğümlerinden ayırmak istiyorum çünkü Açık / Kapalı Prensip uygulamak istiyorum; Ziyaretçi Şablonunun bunun için iyi olduğunu okudum. Desenin nasıl çalıştığını ve çift yönlü gönderimi kullanmanın nasıl bir yol olduğunu iyi anladım. Ancak ağacın özyinelemeli doğası nedeniyle, ona nasıl yaklaşmam gerektiğinden emin değilim. İşte ziyaretçimin neye benzeyeceği:
public class AstEvaluationVisitor
{
public void VisitOperation(OperationNode node)
{
// Here is where I operate on the operation node.
// How do I implement this method?
// OperationNode has two child nodes, which may have other children
// How do I work the Visitor Pattern around a recursive structure?
// Should I access children nodes here and call their Accept method so they get visited?
// Or should their Accept method be called from their parent's Accept?
}
// Other Visit implementation by Node type
}
Demek bu benim sorunum. Daha sonra daha büyük bir sorun yaşamamak için dilim çok fazla işlevsellik desteklemiyorken hemen ele almak istiyorum.
Bunu StackOverflow'a göndermedim, çünkü bir uygulama yapmanızı istemiyorum. Sadece kaçırmış olabileceğim fikirleri ve kavramları ve buna nasıl yaklaşmam gerektiğini paylaşmanızı istiyorum.