先読み
先読みは、コンパイラでの構文解析でも重要な概念である。構文解析器が次に適用すべき生成規則を決定する際に入力トークン列を何個か先読みする。
LL法、LR法、LALR法などの構文解析では、後に括弧つきで先読みするトークン数を記することが多い(LALR(1)など)。
多くのプログラミング言語は、限定的な先読み(1個が典型的)で構文解析できるよう設計されている。というのも先読みを制限した方が構文解析器が効率化されるためである。1990年、Terence Parr は博士論文でANTLRを作成し、この傾向に重大な変化をもたらした。ANTLRは、効率的な LL(k) 構文解析器を生成するパーサジェネレータであり、k として任意の固定値が可能である。
構文解析器は、各トークンを参照したときにとりうるアクションが限られている。
shift - トークンをスタックに積み、後で reduce する。
reduce - スタックからトークンを取り出し、生成規則を適用して構文要素を構築する。
end - 構文解析終了(終了トークンを受け取ったとき)
error - 構文規則にないトークンの並びが入力された場合
conflict - shift すべきか reduce すべきか判断できない。また、reduce で適用可能な規則が複数あって判断できない場合もある。
先読みには次の2つの利点がある。
conflict 発生時、構文解析器が正しい判断をするのを助ける。