先読み
例えば if 文 は先読みすることで then 節や else 節が完了したことが容易にわかる。
状態数を大幅に減らすことができる。C言語で先読みしない構文解析器は約10,000の状態があるが、先読みするとこれを約300に減らせる。
例として、"1 + 2 * 3" という式を構文解析する場合を示す。この場合の生成規則(構文規則)は次の通り。
Rule1: E → E + E (式は式と式の加算である)
Rule2: E → E * E (式は式と式の乗算である)
Rule3: E → number (式は単なる数値である)
Rule4: + は * より優先順位が低い。
APLなどの一部の例外を除いて、一般に加算よりも乗算が優先順位が高い。従って、上記の例は (1 + (2*3)) と解釈するのが正しい。上記のRule4は生成規則ではなく、意味論的規則である点に注意されたい。これを生成規則として表すことも可能である。しかし、意味論的規則が全て生成規則に変換できるわけではない。
単純な先読みのない構文解析器は次のように動作する。
reduce - Rule3 に基づき '1' を式 E にする。その E はスタックに置かれる。
shift - 入力 '+' から Rule1 が適用可能となることを予測しつつ、スタックに退避する。
reduce - Rule3 に基づき '2' を式 E にする。