如何把文法改写为无二义性,请举例让我明白,还有原理是什么?举个简单的文法就行了,谢谢 二义性文法G

作者&投稿:单于嵇 (若有异议请与网页底部的电邮联系)

设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。这样的规则称作消除二义性规则(disambiguating rule)。这样的规则的用处在于:它无需修改文法(可能会很复杂)就可消除二义性;

文法举例

显然,对于not p and q有两种推导方式

默认not优先级高于and,即(not p) and q 

 默认and优先级高于 not,即not(p and q) 

先and再not

先not再and   

扩展资料

如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是dao二义性的。

二义性文法认为是一种语言语法的不完善说明,而且也应避免它。幸运的是,二义性文法在后面将介绍到的标准分析算法的测试中总是失败的,而且也开发出了标准技术体系来解决在程序设计语言中遇到的典型二义性。



有两个解决二义性的基本方法。

其一是:设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。这样的规则称作消除二义性规则(disambiguating rule)。这样的规则的用处在于:它无需修改文法(可能会很复杂)就可消除二义性;

另一种方法是将文法改变成一个强制正确分析树的构造的格式,这样就可以解决二义性了。当然在这两种办法中,都必须确定在二义性情况下哪一个树是正确的。这就再一次涉及到语法制导翻译原则了。我们所需的分析(或语法)树应能够正确地反映将来应用到构造的意义,以便将其翻译成目标代码。

扩展资料

(1) 在这组结点中,有一个且仅有一个没有任何前驱的结点,称之为“根”;

(2) 除根之外,每一结点都恰好有一个直接前驱;

(3) 对于每一结点,都有一条从根到此结点的通路;

(4) 若一个结点有多个直接后继,则按自左向右的顺序进行排序。



将文法改变成一个强制正确分析树的构造的格式,这样就可以解决二义性了。当然在这两种办法中,都必须确定在二义性情况下哪一个树是正确的。这就再一次涉及到语法制导翻译原则了。所需的分析树应能够正确地反映将来应用到构造的意义,以便将其翻译成目标代码。

简单来说,就是人为规定not\and\or的优先级即可  

扩展资料

如果文法G中的某个句子bai存在不只一棵语法树du,则称该句子是二义zhi性的。如果文法含有二dao义性的句子,则称该文法是二义性的,即一个语法存在某个句子对应两个不同的语法树,是二义性文法。

二义性文法认为是一种语言语法的不完善说明,而且也应避免它。幸运的是,二义性文法在后面将介绍到的标准分析算法的测试中总是失败的,而且也开发出了标准技术体系来解决在程序设计语言中遇到的典型二义性。



简述什么是二义性文法~

如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。
二义性文法认为是一种语言语法的不完善说明,而且也应避免它。幸运的是,二义性文法在后面将介绍到的标准分析算法的测试中总是失败的,而且也开发出了标准技术体系来解决在程序设计语言中遇到的典型二义性。

扩展资料:
有两个解决二义性的基本方法。其一是:设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。
在两结点之间,用一条有向边加以连接 (如○m→○n,通常我们把结点m称为结点n的直接前驱或父结点;而将结点n称为结点m的直接后继或子结点),且具有如下的性质:
(1) 在这组结点中,有一个且仅有一个没有任何前驱的结点,称之为“根”;
(2) 除根之外,每一结点都恰好有一个直接前驱;
(3) 对于每一结点,都有一条从根到此结点的通路;
(4) 若一个结点有多个直接后继,则按自左向右的顺序进行排序。
参考资料来源:百度百科——二义性

是二义性的。
二义性定义:“若对于一个文法的某一句子存在两棵不同的语法树,则该文法是二义性文法。”

在本例中,对于句子“abc”有2棵不同的语法树:
S
|
------
| |
A c
|
ab


S
|
------
| |
a B
|
bc

因此这是二义性文法。

“若文法是二义性的,则在编译时就会产生不确定性,遗憾的是在理论上已经证明:文法的二义性是不可判定的,即不可能构造出一个算法,通过有限步骤来判定任一文法是否有二义性。
现在的解决办法是:提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。
由于无二义性文法比较简单,我们也可以采用另一种解决办法:即不改变二义性文法,而是确定一种编译算法,使该算法满足无二义性充分条件。”

在本例中,例如可以添加限制条件:Ac的优先级高于aB,这样可以消除二义性。

如何把文法改写为无二义性,请举例让我明白,还有原理是什么?举个简单的...
答:其一是:设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。这样的规则称作消除二义性规则(disambiguating rule)。这样的规则的用处在于:它无需修改文法(可能会很复杂)就可消除二义性;另一种方法是将文法改变成一个强制正确分析树的构造的格式,这样就可以解决二义...

编译原理笔记9:语法分析树、语法树、二义性的消除
答:【例】:规定优先级和结合性,写出改写的非二义文法 我们已经掌握了一种叫做【改写】的工具,能让我们消除二义性。接下来我们就要用这个工具来尝试搞搞悬空 else 问题!悬空 else 问题出现的原因是 then 数量多于 else,让 else 有多个可以结合的 then。在二义文法中,由于选哪两个 then、else 配对...

如何消除二义性 编译原理
答:1、需要在语法设计时就要考虑了,即使是C/C++也存在二义性、不确定性的语法,对于这种情况,各编译器考虑的不同的方案,主要还是看你如何进行文法分析,可以选一种方便分析的一种去做。2、要判断二义性的存在,可以尝试使用不同的优先顺序解释 假如解释出现歧义,那么一定存在二义性的语法(如经典的++...

将下列语法改为无二义性
答:你试试S推出四个S,一种是S推出的两个S各自再推两个S,再都推括号;另一种是S推出的两个S只有一个往下继续推,像这样:S->SS->SSS->SSSS->()()()(),只推最右边的S。 画出这两种语法树你就清楚了

下面哪些文法是无二义文法
答:LR(k)文法。无二义文法包含二义性的句子,属于无二义文法是LR(k)文法、算符优先文法、LR文法。而它对文法的限制最少,现今能用上下文无关文法描述的程序设计语言一般均可用LR方法进行有效的分析。

把下面文法改写成为无二义的:s→ss/(s)/()
答:S→(AS)|()A→)S( |∑

如果文法g是无二义的则它的任何句子
答:现在的解决办法是:提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。由于无二义性文法比较简单,我们也可以采用另一种解决办法:即不改变二义性文法,而是确定一种编译算法,使该算法满足无二义性充分条件。如果文法G中的某个句子存在不只一棵语法树,...

【编译原理】第二章:语言和文法
答:短语 。 如果子树高度为2,那么这棵子树的边缘称为该句型的一个 直接短语 。直接短语一定是某产生式的右部,但反之不一定。如果一个文法可以为某个句子生成 多棵分析树 ,则称这个文法是 二义性的 。二义性原因:多个if只有一个else; 消岐规则:每个else只与最近的if匹配。

上下文无关文法的子文法类
答:最重要的一类就是无二义的上下文无关文法,因为无二义性对于计算机语言的语法分解至为重要。在无二义的上下文无关文法中最重要的子类是LR(k)文法,它只要求向前看k个符号即能作正确的自左至右语法分解。LR(k)文法能描述所有的确定型上下文无关语言。

现代汉语的特点分别从语法、语音、词汇方面与英语相比较并举例
答:2、在汉语普通话里,有阴平、阳平、上声、去声四个基本声调。这与印欧语系一些非声调语言相比,确实是汉语一个很大的特点,也正是外国学生一个很大的学习难点。二、语法:1、汉语缺少严格意义的形态变化,属于非形态语。人们在语言研究中,按照形态分类法,把世界上的语言分为四大类,即:曲折语、孤立语...