Yanp

ノードのmerge 🔗

next集約を行うと同じ規則で複数の遷移先ができてしまう。
同じ規則での遷移先はただ一つにしたいため、同じ規則の遷移先をマージする。
マージすると構文規則、遷移先が合わさったものになる。

ノードN :
    stmt : . expr
    expr : . left '+' right # 次の記号がleftならノードXに遷移
    expr : . left '-' right # 次の記号がleftならノードYに遷移

↓ leftの遷移先をマージ

ノードN :
    stmt : . expr
    expr : . left '+' right # 次の記号がleftならノードMに遷移
    expr : . left '-' right

ノードM :
    expr : left . '+' right
    expr : left . '-' right

ノードのマージは次の疑似コードで表す。
これをマージができなくなるまで全てのノードに対し行う。

foreach (node in ノード集合)
    if (nodeに同じ記号の遷移先が2つ以上あれば)
        merge = nodeの同じ記号の遷移先をマージ
        nodeから同じ記号の遷移先を削除
        nodeに新たなmergeの遷移を追加