C# 中的解释器:创建一个独立的调用堆栈

Interpreter in C#: Create an Independent Callstack

出于这个问题的目的,我正在用 C# 编写一个支持函数调用的简单解释器。只是

a = x(1, 'x', y: z());

现在,我已将此表达式解析为大致如下形状和形式的 AST:

AssignmentExpression
  VariableReferenceExpression
  FunctionCallExpression
    Int64ConstantExpression

当我在 "full Java" 上使用 ExpressionEvaluatorVisitor 遍历树时,我需要以某种方式调用所有 FunctionCallExpression 的函数。一个明显的选择是将函数名称映射到任意 class 中的静态方法,然后只在正确的 MethodInfo 实例上使用 MethodInfo.Invoke()。然而,这将完全混淆我自己的调用堆栈和解释表达式的调用堆栈。

有没有什么方法可以在 .NET 中创建一个 "alternate" 调用栈,或者有没有其他方法可以区分两个独立的调用栈?

解释器代表被解释的代码执行任务,因此解释器的执行与被解释的代码本质上是耦合的。但是,您可以通过简单地定义一个名为 CallStackElement 的 class 来模拟一个调用堆栈(这对于调试解释程序很有用,如果您想在解释语言中支持可重入函数,则这是必需的)比如MethodNameParameterListLocalVariables,等等,还有一个Stack<CallStackElement>。每当被解释的代码调用一个函数(无论是用户定义的函数还是库函数)时,向这个堆栈添加一个元素,并在函数完成时将其弹出。如果您支持用户定义的函数,则应在调用堆栈的最顶层元素中查找局部变量和参数。