Я пытаюсь создать AST для таблицы логики принятия решений. Одна из вещей, которую я хотел бы сделать с дискриминационным объединением, представляющим мой AST, - это преобразовать его части по разным причинам. Для наглядности приведу пример
Таблица логики принятия решения
@ 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, я хочу выдать новое правило для каждой строки в списке записей, где условие объединяется с записью. Это имеет какой-то смысл?
Заранее спасибо за любой совет.
p.s. Я не совсем пытался скомпилировать приведенный выше пример, поэтому, пожалуйста, простите любые грамматические ошибки.