区分歧义和无歧义语法

在了解歧义语法和无歧义语法之间的区别之前,让我们先了解一下这些概念。

歧义语法

如果对于给定的输入字符串存在多个最左派生或多个最右派生或多个分析树,则称该文法是二义性的。

  • 如果文法没有歧义,那么我们称其为无歧义文法

  • 如果语法有歧义,那么它有利于编译器构造

  • 没有任何方法可以自动检测和去除歧义,但我们可以通过重写整个没有歧义的语法来去除歧义。

例子

让我们考虑一个带有生产规则的语法 -

E=I
E=E+E
E=E*E
E=(E)
E= ε|0|1|2|3……9

明确的语法

如果语法不包含歧义,这意味着对于给定的输入字符串,它不包含一个以上最左派生或一个以上最右边派生或一个以上解析树,则该文法可以是无歧义的。

例子

S -> AB
A -> Aa / a
B -> b

差异

歧义和无歧义语法之间的主要区别如下 -

歧义语法明确的语法
It generates more than one- parse tree ( syntax tree or derivation tree)它只生成一个解析树(派生树或语法树)
In this type of grammar, the leftmost and rightmost derivation represents different parse trees.在这种类型的文法中,最左边和最右边的派生代表相同的分析树。
This grammar contains a smaller number of non-terminals.此文法包含更多的非终结符。
The length of the parse tree is less.解析树的长度很大。
Example 
S → S + S / S x S / id
(Ambiguous Grammar)
示例 -
S → S + E / E
E → E x F / F
F → id
(无歧义语法)