LR法

From Wikipedia, the free encyclopedia

LR法またはLR構文解析器とは、文脈自由文法構文解析手法/構文解析器である。LR法では、入力を左(Left)から右に読んでいき、右端導出(Rightmost derivation)を行う。このためLRと名づけられている。「LR(k)」といった場合、k は、消費をともなうことなく「先読み」が進められる入力記号の最大数を意味する。通常、k は 1 であり、その場合省略されることが多い。LR(k)の構文解析器が対応する文脈自由文法も LR(k) と呼ばれる。

LR法はいわゆるボトムアップ構文解析を行う。つまり、から始めて最上位の構文要素にたどり着く。

ほとんどのプログラミング言語の文法は LR(1) で表されるため、LR法はコンパイラソースコードの構文を解析する際によく使われる。

一般にLR構文解析器と言った場合、文脈自由文法に基づいた特定の言語を理解する特定の構文解析器を意味していることが多い。

LR法には次のような利点がある:

  • 多くのプログラミング言語がLR法(およびそれを一部改変したもの)で構文解析できる。例外として、C++Perlがある。
  • LR法の実装は非常に効率的である。
  • 入力を左から右に読んでいく構文解析器の中では、LR構文解析器は構文エラーを可能な限り素早く検出できる。

LR法には次のような欠点がある:

  • LL法に比べ、コンパイルエラー時のエラーメッセージを適切に出しにくい。

LR構文解析器を1から書くのは難しく、パーサジェネレータを使って生成するのが一般的である。構文解析表の生成手法の違いにより、単純LR法(SLR)、LALR法正規LR法に分類される。後者ほど大規模な文法を扱える(LALR法はSLR法より強力で、正規LR法はLALR法より強力である)。yaccはLALR法による構文解析器を生成する。

LR法の構成

LR(0) 構文解析表の作成

参考文献

Related Articles

Wikiwand AI