मैं अपनी स्वयं की प्रोग्रामिंग भाषा बनाने की प्रक्रिया में हूं, जो मैं सीखने के उद्देश्यों के लिए करता हूं। मैंने अपनी भाषा के सबसेट के लिए पहले से ही लेक्सर और एक पुनरावर्ती वंश पार्सर लिखा था (मैं वर्तमान में गणितीय अभिव्यक्तियों, जैसे कि + - * /
और कोष्ठक का समर्थन करता हूं )। पार्सर मुझे एक सार सिंटेक्स ट्री वापस सौंपता है, जिस पर मैं Evaluate
अभिव्यक्ति का परिणाम प्राप्त करने के लिए विधि कहता हूं । सब कुछ ठीक काम करता है। यहाँ मेरी लगभग वर्तमान स्थिति है (C # में कोड उदाहरण, हालांकि यह बहुत अधिक भाषा-अज्ञेयवादी है):
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;
}
}
हालाँकि, मैं ट्री नोड्स से एल्गोरिथ्म को डिकॉप्ल करना चाहूंगा क्योंकि मैं ओपन / क्लोज्ड सिद्धांत लागू करना चाहता हूं इसलिए मुझे हर नोड क्लास को फिर से खोलना नहीं है जब मैं उदाहरण के लिए कोड जनरेशन को लागू करना चाहता हूं। मैंने पढ़ा कि विज़िटर पैटर्न उसके लिए अच्छा है। मुझे इस बात की अच्छी समझ है कि पैटर्न कैसे काम करता है और यह कि डबल डिस्पैच का उपयोग कैसे होता है। लेकिन पेड़ की पुनरावर्ती प्रकृति के कारण, मुझे यकीन नहीं है कि मुझे इसे कैसे देखना चाहिए। यहाँ मेरा विज़िटर कैसा दिखेगा:
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
}
तो यह मेरी समस्या है। मैं इसे तुरंत निपटना चाहता हूं जबकि मेरी भाषा बाद में बड़ी समस्या से बचने के लिए बहुत अधिक कार्यशीलता का समर्थन नहीं करती है।
मैंने इसे StackOverflow में पोस्ट नहीं किया क्योंकि मैं नहीं चाहता कि आप एक कार्यान्वयन प्रदान करें। मैं केवल यह चाहता हूं कि आप उन विचारों और अवधारणाओं को साझा करें जिन्हें मैं याद कर सकता हूं, और मुझे यह कैसे करना चाहिए।