ฉันอยู่ในขั้นตอนการสร้างภาษาโปรแกรมของฉันเองซึ่งฉันใช้เพื่อจุดประสงค์ในการเรียนรู้ ฉันเขียน lexer และ parser ที่สืบเชื้อสายแบบเรียกซ้ำสำหรับชุดย่อยของภาษาของฉัน (ปัจจุบันฉันสนับสนุนการแสดงออกทางคณิตศาสตร์เช่น+ - * /
และวงเล็บ) โปรแกรมแยกวิเคราะห์ส่งกลับต้นไม้ทรีของฉันซึ่งฉันเรียก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;
}
}
อย่างไรก็ตามฉันต้องการ decouple อัลกอริทึมจาก tree nodes เพราะฉันต้องการใช้ Open / Closed Principle ดังนั้นฉันไม่จำเป็นต้องเปิดโหนดทุกคลาสอีกครั้งเมื่อฉันต้องการใช้การสร้างรหัสเช่น ฉันอ่านว่ารูปแบบผู้เข้าชมนั้นดีสำหรับสิ่งนั้น ฉันมีความเข้าใจที่ดีเกี่ยวกับรูปแบบการทำงานและการใช้การส่งแบบคู่เป็นวิธีที่จะไป แต่เนื่องจากลักษณะของต้นไม้ที่เกิดซ้ำฉันไม่แน่ใจว่าฉันควรเข้าใกล้มันอย่างไร นี่คือลักษณะที่ผู้เข้าชมของฉันจะมีลักษณะ:
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 เพราะฉันไม่ต้องการให้คุณดำเนินการ ฉันแค่อยากให้คุณแบ่งปันแนวคิดและแนวคิดที่ฉันอาจพลาดไปและฉันควรจะเข้าหาสิ่งนี้อย่างไร