📅  最后修改于: 2020-12-17 07:47:17             🧑  作者: Mango
如果对于给定的输入字符串,存在不止一个最左导数或不止一个最右导数或不止一个解析树,则文法是不明确的。如果语法不是模棱两可的,那么就将其称为模棱两可。
如果语法有歧义,则不利于编译器的构造。没有方法可以自动检测并消除歧义,但是我们可以通过重写整个语法而不会歧义来消除歧义。
让我们考虑带有生成规则的语法G
E → I
E → E + E
E → E * E
E → (E)
I → ε | 0 | 1 | 2 | ... | 9
解:
对于字符串“ 3 * 2 + 5”,上述语法可以通过最左侧的派生生成两个解析树:
由于单个字符串“ 3 * 2 + 5”有两个解析树,因此语法G是模棱两可的。
检查给定的语法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是不明确的。
检查给定的语法G是否模棱两可。
S → aSb | SS
S → ε
解:
对于字符串“ aabb”,上述语法可以生成两个解析树
由于单个字符串“ aabb”有两个解析树,因此语法G是模棱两可的。
检查给定的语法G是否模棱两可。
A → AA
A → (A)
A → a
解:
对于字符串“ a(a)aa”,上述语法可以生成两个解析树:
由于单个字符串“ a(a)aa”有两个解析树,因此语法G是不明确的。