我正在创建自己的编程语言,出于学习目的。我已经为我的语言的一部分编写了词法分析器和递归下降解析器(我目前支持数学表达式,例如+ - * /
和括号)。解析器将我交给一个抽象语法树,在该语法树上我调用该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,因为我不希望您提供实现。我只希望您分享我可能错过的想法和概念,以及我应该如何处理。