Yacc
この方式では、次の有名な例のように、同じ入力を同じ構文規則で複数の解釈ができてしまう曖昧性が避けられない。
Yaccではyaccコマンド実行時に解釈が複数生じる曖昧なケースを発見した場合に「還元/還元衝突警告」または「シフト/還元衝突警告」を出す。これによって、文法を作成中なら文法を、そうでなければ構文規則を改良するきっかけが得られる。
まず「還元/還元衝突警告」が出た場合であるが、パーサが正しい処理をできない構文要素が生じてしまうので、文法、または構文規則のYacc定義を直した方がよい。
ある非終端記号から別の非終端記号に至る呼び出しパスが複数あれば、それは間違いなので直す。
しかし元の言語が複雜すぎてうまく直せない場合は、片方を実体は同じでも別の名前を付けるトークン由来で構成するようにし、Lex側がどちらのトークンをYaccパーサに出すかは状態に応じて変えるようにコーディングしておく方法がある:
状態がトークン列だけから一意に決められるならLex単独で処理できる。しかし、Yaccが実行時にあるルールのマッチを検出したときにはじめて状態を変えたいという複雜なケースでは、次のようにする。
↑ 英: semantic value
↑ 英: lexical analyzer
↑ 英: fast lexical analyzer generator
↑ Theory of Compilation -- JLex, CUP tools --(PDF) - Haifa Univ. Bilal Saleh
↑ POSIX 1003.1-2008 - IEEE(有料)
↑ An Overview of Parser Generator Tools for Java
↑ G・フリードマン著、矢吹道郎ら訳、竹本 浩OCR復刻 Cコンパイラ設計(yacc・lexの応用) y.outputの解説は、文法のチェック および 言語認識 に詳しい。
1 2 パーサーの操作 - Oracle
1 2 A yacc tutorial - Arizona大学 CSc 453: Supporting Documents
1 2 Yacc: A Parser Generator(pdf) by Stephen C. Johnson.(Yacc作者)and Ravi Sethi
↑ Bison 2.7 8.1 Understanding Your Parser
「+」、「-」、「*」、「/」、べき乗の「**」、剰余の「%」。
「+」および「-」においては単項と二項の両方。
カッコ「()」で演算順序を明示すること。