/** * S-FEEL 子集的抽象语法树(编码规范 §8.3)。 * AST 是可 diff、可静态检查的中间形态 —— 前端画布的即时校验与后端裁决同源。 */ export type Node = | { readonly kind: 'literal'; readonly value: number | string | boolean | null } | { readonly kind: 'path'; readonly segments: readonly string[] } | { readonly kind: 'unary'; readonly op: '-' | 'not'; readonly operand: Node } | { readonly kind: 'binary'; readonly op: '+' | '-' | '*' | '/' | '=' | '!=' | '<' | '<=' | '>' | '>=' | 'and' | 'or'; readonly left: Node; readonly right: Node; } | { readonly kind: 'list'; readonly items: readonly Node[] } | { readonly kind: 'range'; readonly startOpen: boolean; readonly endOpen: boolean; readonly start: Node; readonly end: Node; } | { readonly kind: 'in'; readonly value: Node; readonly candidates: Node } | { readonly kind: 'call'; readonly name: string; readonly args: readonly Node[] }; /** 单元格谓词(DMN 决策表的一格):`-` 任意、`<10`、`[1..5]`、`"A","B"` 析取 */ export type UnaryTest = | { readonly kind: 'any' } | { readonly kind: 'compare'; readonly op: '=' | '!=' | '<' | '<=' | '>' | '>='; readonly operand: Node } | { readonly kind: 'range'; readonly node: Extract } | { readonly kind: 'disjunction'; readonly tests: readonly UnaryTest[] };