4

決定論理表の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上記の例をコンパイルしようとはしていませんので、文法上の誤りはご容赦ください。

4

1 に答える 1

2

うーん、ひどく分割されたASTに基づいて、ここにtranform必要な入力から出力を生成する関数があります(再帰的ではありませんが、List.mapパターンマッチングで使用expressionするだけです。唯一の再帰型ですが、次のようには見えません。再帰的に処理したいですか?):

let ex1 =
    ConditionEntries(
        Equality(
            Variable("VAR"), 
            Value(10.0)), 
        Entries([Entry("Y")]))

let ex2 =
    ConditionEntries(
        Equality(
            Variable("VAR"), 
            Value(10.0)), 
        Entries([Entry("X");Entry("Y");Entry("Z")]))

let transform ces =
    match ces with
    | ConditionEntries(x, Entries(entries)) ->
        entries
        |> List.map (function Entry(entry) -> Condition(x, entry))


//FSI output:
> transform ex1;;
val it : condition list =
  [Condition (Equality (Variable "VAR",Value 10.0),"Y")]
> transform ex2;;
val it : condition list =
  [Condition (Equality (Variable "VAR",Value 10.0),"X");
   Condition (Equality (Variable "VAR",Value 10.0),"Y");
   Condition (Equality (Variable "VAR",Value 10.0),"Z")]
于 2011-09-19T02:24:11.820 に答える