基礎仕様 02 / AST

AST — Data Modelを扱うobject形式。

AST v0.2は、Data Modelで定義した文書nodeとvalueをvisitor・transformer・rendererが扱うためのメモリ内object表現です。Matra sourceの構文木(MatraModule)とは異なり、Data Modelとは別種の言語値でもありません。MatraJSONとの相互変換で同じ文書構造を保ちます。

仕様v0.3、個別npm package version、compiler ABIは別々に管理されます。

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を拒否します。

区別すること

このページは概要です。

このページは要約です。規範的な定義、全API契約、検証fixtureはリンク先のMatra仕様書を参照してください。

一次資料