我正在设计一种决策逻辑表的AST。我希望能够使用表示AST的区分联合,以便出于不同的原因转换它的部分。为了更加清晰,我将给你一个例子。
决策逻辑表:
@ VAR = 10 ;Y;
以上可以理解为有一条规则,条件VAR = 10进入此规则,并有一个Y条目。
抽象语法树定义(简化为此示例):
现在我想做的是将上述树转换为展开条目中表示的规则。我的想法是使用递归函数和模式匹配来实现,但我现在有点难以理解。
我想做的实质上是,每当我看到ConditionEntries节点时,我希望针对Entries列表中的每个字符串发出一个新的Rule,其中Condition与Entry结合。这有意义吗?
提前感谢任何建议。
附言:我还没有尝试编译上面的示例,请原谅任何语法错误。
决策逻辑表:
@ VAR = 10 ;Y;
以上可以理解为有一条规则,条件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节点时,我希望针对Entries列表中的每个字符串发出一个新的Rule,其中Condition与Entry结合。这有意义吗?
提前感谢任何建议。
附言:我还没有尝试编译上面的示例,请原谅任何语法错误。
... | branch -> branch
。 - Stephen Swensen