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