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