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