aiscript
aiscript copied to clipboard
ASTの全ノードを簡単にスキャンできるようにしたい
子ノードをできるだけchildrenに持つようにして、統一的にスキャンできるように。 (if式など複数の子ノード配列を持つノード以外)
ちょっと保留
これやりたいけど広範囲に影響するので、落ち着いたらやる
トラバーサルする時にswitchと再帰呼び出しで手書きするとコードが肥大化する。 トラバーサルしたい場面が多いからノードを抽象化したい。
案1
~~ノードには複数の子を持つことができるchildrenプロパティを用意して、統一的にトラバーサルできるようにする。
ifのthen処理など複数の子を持つノードはmultipleNodeみたいなノードタイプを用意して一つにまとめる。
こうすれば、then、elseif、elseなど子に複数のブロックを持つノードも抽象化されたchildrenに持つことができる。~~
~~multipleNodeまで抽象化せずに、elseノードみたいな感じで子に持っても良いかも知れない。
(抽象化しすぎると、それが何かわからないので)~~
イメージ
const ifNode = {
type: 'if',
children: [
{
type: 'then',
children: [/* ... */]
},
{
type: 'else',
children: [/* ... */]
}
]
};
どうするのが良いのか分からなくなってきた
やっぱこのアプローチやめるか
案2
ノードの子ノードはすべてchildrenに持つ。
子ノードの種類を区別する必要がある場合(ifノードの子としてelseのステートメントとelseifのステートメント&条件を持つ必要がある場合など)は、子と親の間にその区別のためのノード(elseノードやelseifノード等)を追加する。
区別の必要がない場合はそのままchildrenに子ノードを持つ。
その場合、今までifノードのelseを実行したかったら ifNode.else みたいにアクセスしていたところを ifNode の children からelseノードを探してくる実装にする必要がある?
そうなるね そこのコストが上がるのと、全ノードのトラバーサルのしやすさはトレードオフになる気がするよ
他の実装も参考にしたい
JS系のASTとかどんな感じでやってるんだろう トランスパイラとか
parser/visit.tsを追加した。一応解決したような感じがある?