aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

ASTの全ノードを簡単にスキャンできるようにしたい

Open marihachi opened this issue 4 years ago • 12 comments

子ノードをできるだけchildrenに持つようにして、統一的にスキャンできるように。 (if式など複数の子ノード配列を持つノード以外)

marihachi avatar Jul 27 '21 17:07 marihachi

ちょっと保留

marihachi avatar Aug 17 '21 21:08 marihachi

これやりたいけど広範囲に影響するので、落ち着いたらやる

marihachi avatar Sep 12 '21 14:09 marihachi

トラバーサルする時にswitchと再帰呼び出しで手書きするとコードが肥大化する。 トラバーサルしたい場面が多いからノードを抽象化したい。

案1

~~ノードには複数の子を持つことができるchildrenプロパティを用意して、統一的にトラバーサルできるようにする。 ifのthen処理など複数の子を持つノードはmultipleNodeみたいなノードタイプを用意して一つにまとめる。 こうすれば、then、elseif、elseなど子に複数のブロックを持つノードも抽象化されたchildrenに持つことができる。~~

marihachi avatar Oct 30 '21 03:10 marihachi

~~multipleNodeまで抽象化せずに、elseノードみたいな感じで子に持っても良いかも知れない。 (抽象化しすぎると、それが何かわからないので)~~

イメージ

const ifNode = {
  type: 'if',
  children: [
    {
      type: 'then',
      children: [/* ... */]
    },
    {
      type: 'else',
      children: [/* ... */]
    }
  ]
};

marihachi avatar Oct 30 '21 03:10 marihachi

どうするのが良いのか分からなくなってきた

marihachi avatar Oct 30 '21 15:10 marihachi

やっぱこのアプローチやめるか

marihachi avatar Oct 30 '21 15:10 marihachi

案2

ノードの子ノードはすべてchildrenに持つ。 子ノードの種類を区別する必要がある場合(ifノードの子としてelseのステートメントとelseifのステートメント&条件を持つ必要がある場合など)は、子と親の間にその区別のためのノード(elseノードやelseifノード等)を追加する。 区別の必要がない場合はそのままchildrenに子ノードを持つ。

marihachi avatar Oct 31 '21 02:10 marihachi

その場合、今までifノードのelseを実行したかったら ifNode.else みたいにアクセスしていたところを ifNode の children からelseノードを探してくる実装にする必要がある?

syuilo avatar Oct 31 '21 15:10 syuilo

そうなるね そこのコストが上がるのと、全ノードのトラバーサルのしやすさはトレードオフになる気がするよ

marihachi avatar Oct 31 '21 15:10 marihachi

他の実装も参考にしたい

marihachi avatar Oct 31 '21 15:10 marihachi

JS系のASTとかどんな感じでやってるんだろう トランスパイラとか

marihachi avatar Oct 31 '21 15:10 marihachi

parser/visit.tsを追加した。一応解決したような感じがある?

marihachi avatar Sep 04 '22 15:09 marihachi