曖昧な文法
yaccなどのパーサジェネレータの場合、曖昧な文法はパーサを生成する際の内部処理で発見されるコンフリクトとして報告される。なお、これは前述した制限を破るようなものではない。yaccの場合、記述可能な文法は文脈自由文法に限られており、任意の文法について判定できるわけではないし、曖昧な文法ではなくてもコンフリクトになることはある。
実用性を重視したパーサジェネレータでは、中置記法の数式のような文法について、生成規則だけでは曖昧になるような規則で書くことを許し、それを補助するような、演算子について優先順位や結合性(en:Operator associativity)を示す規則を追加することで曖昧さを解決する、というような手法が提供されている。
プログラミング言語ではしばしば型などによって式の意味が異なったりすることがある。しかしそれはここで議論しているような統語の曖昧性ではない(なお、プログラミング言語では、「統語」よりも「構文」という語を使うことが多いので、この節でのみ以下は用語を変える)。またC言語を例にとるとtypedefの機能によって、字面的には全く同じトークンが、識別子ではなく型名になるために構文が静的に解析できない、といった例があるが、それもここで議論しているような曖昧性とは異なる。en:Dangling else の問題は、文脈自由文法として見た場合は曖昧さがあるということだが、構文解析器として実装された時点で曖昧さは無くなっている。
以上のように、構文の曖昧さが実際にあることはあまり無いが、Perlにおける正規表現リテラル中の変数展開と文字クラス記述のように、構文規則的には実際に多義的になっていて、実際に使われている文字種によりヒューリスティク的に解釈が変わるという事例もあるにはある。
次の文脈自由文法、
A → A + A | A − A | a
は、曖昧である。記号列 a + a + a の左端導出が2通りになるという例と、記号列 a + a − a の解釈が2通りあるという例を示す。
記号列 a + a − a について。
(a + a) − a
a + (a − a)
なお、この規則から生成される言語は、記号列の集合としての言語としては、「本質的に曖昧」ではない。次のような曖昧さの起きない規則で、同じ記号列の集合を生成できるからである。
A → A + a | A − a | a