Моделирование связанных выражений в AST
Предисловие
Я впервые пытаюсь написать интерпретатор / компилятор. Токенизация и синтаксический анализ - это уже то, что я, кажется, понял. Я все еще борюсь, потому что есть некоторые языковые конструкции, которые сложно смоделировать. См. Пример кода, который я пытаюсь преобразовать в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
Вопросы:
А. Должен приковатьExpressions
моделироваться как массив, должны ли они быть вложены друг в друга? Какая модель наиболее практична для последующей оценки и обхода?
Б. Вfunc
assignToChainedExpressions
имеет ли смысл присваивать значение цепочке, в которой первый Expression
это ClassInstantiation
? Вinstance
я полагаю, сам будет выброшен во время выполнения.
C. В большинстве примеров используется очень простая модель дляAssignment
операция. Видеть:
class Assignment { string Identifier { get; } Expression Expression { get; } }
Как следует моделировать более сложное назначение, если левая часть операции является Expression
также?
Edit1:
Было бы неплохо смоделировать 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)