0

序文

初めてインタプリタ/コンパイラを書こうとしています。トークン化と解析は、私が理解したように見えるものです。モデル化するのが難しい言語構造がいくつかあるため、私はまだ苦労しています。に変換しようとしているサンプル コードを参照してください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も同様である場合、より複雑な割り当てをどのようにモデル化する必要がありますか?


編集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)
4

0 に答える 0