区分模糊语法和非模糊语法
在了解模糊语法和非模糊语法的区别之前,让我们先学习一下这些概念。
模糊语法
如果对于给定的输入字符串存在多个最左推导或多个最右推导或多个语法树,则称该语法为模糊语法。
如果语法不是模糊的,我们就称之为非模糊语法。
如果语法存在歧义,则它对编译器构造有利。
没有方法可以自动检测和消除歧义,但我们可以通过重写整个语法来消除歧义。
示例
让我们考虑一个具有如下产生式规则的语法:
E=I E=E+E E=E*E E=(E) E= ε|0|1|2|3……9
非模糊语法
如果语法不包含歧义,也就是说,对于给定的输入字符串,它不包含多个最左推导或多个最右推导或多个语法树,则该语法可以是非模糊的。
示例
S -> AB A -> Aa / a B -> b
区别
模糊语法和非模糊语法的主要区别如下:
| 模糊语法 | 非模糊语法 |
|---|---|
| 它生成多于一颗语法树(语法树或推导树)。 | 它恰好生成一颗语法树(推导树或语法树)。 |
| 在这种类型的语法中,最左推导和最右推导表示不同的语法树。 | 在这种类型的语法中,最左推导和最右推导表示相同的语法树。 |
| 这种语法包含较少的非终结符。 | 这种语法包含较多的非终结符。 |
| 语法树的长度较短。 | 语法树的长度较长。 |
| 示例: S → S + S / S x S / id (模糊语法) | 示例: S → S + E / E E → E x F / F F → id (非模糊语法) |
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP