0

前言

我第一次尝试编写解释器/编译器。标记化和解析已经是一件事,我似乎已经想通了。我仍然发现自己在苦苦挣扎,因为有些语言结构很难建模。请查看我尝试转换为abstract syntax tree.

class Class1 {
  var someVariable = true;
}

class Class2 {
  var instanceOf1 = new Class1();
  func getSomething(): Class1 {
    return instanceOf1;
  }
}

class Class3 {
  func assignFromChainedExpressions() {
    var result = new Class2().getSomething().someVariable;
                 -----------1 -------------2 -----------3
  }

  func assignToChainedExpressions() {
    new Class2().getSomething().someVariable = false;
    -----------4 -------------5 -----------6
  }
}

带下划线的表达式建模AST为:

1,4: ClassInstantiation
2,5: MethodCall
4,6: VariableAccess

问题:

A. chained 应该Expressions被建模为一个数组,它们应该相互嵌套吗?后期评估和遍历最实用的模型是什么?

B.在 中func assignToChainedExpressions,将值分配给链是否有意义,其中第一个Expression是 a ClassInstantiation?我想,instance它本身会在运行时被丢弃。

C.大多数示例使用非常简单的模型进行Assignment操作。看:

class Assignment { string Identifier { get; } Expression Expression { get; } }

如果操作的左侧也是 an,应该如何对更复杂的赋值建模Expression


编辑1:

像这样建模是否是个好主意assignFromChainedExpressions

AnonymousVariableDeclaration(value: new Class2())          // anon1
AnonymousVariableDeclaration(value: anon1.getSomeThing())  // anon2
VariableDeclaration(name: "result", value: anon2.someVariable);

像这样建模是否是个好主意assignToChainedExpressions

AnonymousVariableDeclaration(value: new Class2())          // anon1
AnonymousVariableDeclaration(value: anon1.getSomeThing())  // anon2
Assign(anon2.someVariable, false)
4

0 回答 0