01 / SHAPE
nodeの形
意味を持つfieldはtag、props、childrenです。propsとchildrenの中身はデータモデルのvalueに従います。実装はsource positionなどのmetadataを追加できますが、意味上の値を変えてはいけません。
type MatraScalar = string | number | boolean | null
type MatraValue =
| MatraScalar
| MatraValue[]
| { [key: string]: MatraValue }
interface MatraAST {
tag: string
props: Record<string, MatraValue>
children: Array<MatraAST | MatraValue>
}
02 / CONVERSION
MatraJSONと相互変換
object形式の{tag, props, children}とMatraJSONの[tag, props, children]は、再帰的かつ情報を失わずに相互変換できなければなりません。tag、value、scalar型、子node、child順序を保ちます。可変list/mapは意図しない共有を避けるためcopyすることが推奨されます。
{ tag: "item", props: {}, children: ["one"] }
// MatraJSON: ["item", {}, ["one"]]
03 / SOURCE POSITION
位置情報はmetadata
AST nodeは任意でpositionを持てます。start/end pointのoffsetは0始まり、lineとcolumnは1始まりです。位置情報は文書値の等価性に含まれず、3要素のMatraJSONには出力しません。
04 / VALIDATION
nodeを検証する
tagがstringでない、propsがstring-keyed value mapでない、childrenがlistでない、またはchildがAST node/valueでない場合、validatorはnodeを拒否します。