📜  语法中的自动机歧义

📅  最后修改于: 2020-12-17 07:47:17             🧑  作者: Mango

语法歧义

如果对于给定的输入字符串,存在不止一个最左导数或不止一个最右导数或不止一个解析树,则文法是不明确的。如果语法不是模棱两可的,那么就将其称为模棱两可。

如果语法有歧义,则不利于编译器的构造。没有方法可以自动检测并消除歧义,但是我们可以通过重写整个语法而不会歧义来消除歧义。

范例1:

让我们考虑带有生成规则的语法G

E → I
E → E + E
E → E * E
E → (E)
I → ε | 0 | 1 | 2 | ... | 9

解:

对于字符串“ 3 * 2 + 5”,上述语法可以通过最左侧的派生生成两个解析树:

由于单个字符串“ 3 * 2 + 5”有两个解析树,因此语法G是模棱两可的。

范例2:

检查给定的语法G是否模棱两可。

E → E + E
E → E - E
E → id

解:

从上面的语法中,字符串“ id + id-id”可以通过两种方式得出:

第一个最左导数

E → E + E
   → id + E
   → id + E - E
   → id + id - E
   → id + id- id

第二最左导数

E → E - E
   → E + E - E
   → id + E - E
   → id + id - E
   → id + id - id

由于单个字符串“ id + id-id”有两个最左侧的派生,因此语法G是不明确的。

范例3:

检查给定的语法G是否模棱两可。

S → aSb | SS
S → ε

解:

对于字符串“ aabb”,上述语法可以生成两个解析树

由于单个字符串“ aabb”有两个解析树,因此语法G是模棱两可的。

范例4:

检查给定的语法G是否模棱两可。

A → AA
A → (A)
A → a

解:

对于字符串“ a(a)aa”,上述语法可以生成两个解析树:

由于单个字符串“ a(a)aa”有两个解析树,因此语法G是不明确的。