আমি আমার নিজস্ব প্রোগ্রামিং ভাষা তৈরির প্রক্রিয়াধীন, যা আমি শেখার উদ্দেশ্যে করি। আমি ইতিমধ্যে আমার ভাষার একটি উপসেটের জন্য লেক্সার এবং একটি পুনরাবৃত্ত ডিসেন্ট পার্সার লিখেছি (আমি বর্তমানে গাণিতিক এক্সপ্রেশন যেমন, + - * /
এবং প্রথম বন্ধনী সমর্থন করি )। পার্সার আমাকে একটি বিমূর্ত সিনট্যাক্স ট্রি ফিরিয়ে দেয়, যার উপরে আমি Evaluate
অভিব্যক্তির ফলাফল পাওয়ার জন্য পদ্ধতিটি কল করি । সবকিছু ঠিকঠাক কাজ করে। এখানে প্রায় আমার বর্তমান পরিস্থিতি রয়েছে (সি # তে কোডের উদাহরণ, যদিও এটি ভাষা-অজ্ঞাতসৃষ্টিকর হলেও):
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
}
সুতরাং এটি আমার সমস্যা। আমি তত্ক্ষণাত এটিকে মোকাবেলা করতে চাই যখন আমার ভাষা পরে আরও বড় সমস্যা এড়াতে প্রচুর কার্যকারিতা সমর্থন করে না।
আমি এটি স্ট্যাকওভারফ্লোতে পোস্ট করিনি কারণ আমি চাই না আপনি কোনও বাস্তবায়ন সরবরাহ করুন। আমি কেবল চাই আপনি ধারণাগুলি এবং ধারণাগুলি ভাগ করুন যা আমি মিস করেছি এবং এবং কীভাবে আমার এটির কাছে আসা উচিত।