Предисловие
Я пытаюсь написать интерпретатор / компилятор впервые. Токенизация и синтаксический анализ - это уже вещь, которую я, кажется, понял. Я все еще испытываю трудности, потому что есть некоторые языковые конструкции, которые трудно смоделировать. Посмотрите пример кода, который я пытаюсь преобразовать в 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. Должен ли цепочка Expressions
моделироваться как массив, если они вложены друг в друга? Какова наиболее практичная модель для последующей оценки и обхода?
B. В 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)