Моделирование цепных выражений в AST - PullRequest
0 голосов
/ 18 февраля 2020

Предисловие

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