Моделирование связанных выражений в 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)

0 ответов

Другие вопросы по тегам