決定論理表のASTを設計しようとしています。私のASTを表す識別された共用体で実行できるようにしたいことの1つは、さまざまな理由でその一部を変換することです。わかりやすくするために、例を示します
決定論理表
@ VAR = 10; Y;
上記は、ルールが1つあり、条件VAR = 10がYエントリでこのルールに入るため、読み取ることができます。
抽象構文木の定義(この例では簡略化されています)
type expression =
| Value of double
| Variable of string
| Equality of expression * expression
type entry =
| Entry of string
type entries =
| Entries of entry list
type conditional =
| ConditionEntries of expression * entries
type condition
| Condition of expression * string
type rule =
| Rule of condition list
レンダリング(変換前)
ConditionEntries(
Equality(
Variable("VAR"),
Value(10.0)),
Entries(["Y"]))
レンダリング(変換後)
Rule(
Condition(
Equality(
Variable("VAR"),
Value(10.0)
),
Entry("Y")
)
)
次に、上記のツリーを変換して、エントリに表示されているルールを展開します。私の考えでは、再帰関数とパターンマッチングを使用してこれを行うことができますが、現在、頭を包むのに少し問題があります。
本質的に、私がやろうとしているのは、ConditionEntriesノードが表示されるたびに、ConditionがEntryと組み合わされているEntriesリストのすべての文字列に対して新しいルールを発行することだと思います。それは意味がありますか?
アドバイスをよろしくお願いします。
ps上記の例をコンパイルしようとはしていませんので、文法上の誤りはご容赦ください。