Table of Contents

構文解析表 · CLR — 実装

正直に言うと — エンジンは CLR をまだ実装していません。 だからこのページは短いです。
でも できることとできないこと をはっきり書いておくのがこのマニュアルの約束なので、あるがまま お見せします。


状態生成の分岐における CLR の居場所

エンジンで状態のまとまりを作るコード(CanonicalRelation)は方式に応じて三つに分かれますが、CLR はこの道です。

else if (canonicalType == CanonicalType.C1)   // CLR
    ConstructC1(...);

ところがその ConstructC1 の中身が — 空っぽです。

private void ConstructC1(NonTerminal virtualStartSymbol, RelationData relationData)
{
    // (空 — LR(1) 状態生成は未実装)
}

だから CLRParser の衝突チェックもこうなっています。

public override AmbiguityCheckResult CheckAmbiguity()
    => throw new NotImplementedException();   // CLR — 未実装

なぜ作らなかったのか

しくみ で見たように、CLR は 状態の爆発 という代償が高くつきます。そして次章で見る LALR が — その爆発なしに ほぼ同じ精密度(LR(1) 級) を出してくれるのです。

だからエンジンは 本物の CLR を作らず、LALR で LR(1) にほぼ匹敵する力を出す ほうを選びました。(実務の構文解析器生成器がよくする選択です。)表向きに「LR(1) 対応!」と書く代わりに、実際にできるのは LALR だと正直に書いておく、というわけです。


次へ

では、その LALR は — 完璧な CLR をどう「マージして」 爆発なしに精密度を出すのでしょうか?

👉 構文解析表 · LALR — しくみ