2.5.2 文法的二义性

article/2025/10/14 20:39:09

2.5.2 文法的二义性

设有文法 G [ E ]:

E → E + E | E * E | ( E ) | i

句子 i * i + i 有两个不同的最左推导,对应两棵不同的语法树,见图 2.6 和图 2.7 。

最左推导 1

 E ⇒ E + E ⇒ E * E + E ⇒ i * E + E⇒ i * i + E⇒ i * i + i 

最左推导 2

E ⇒ E * E ⇒ i * E⇒ i * E + E⇒ i * i + E⇒ i * i + i

图 2.6 最左推导 1 的语法树
在这里插入图片描述

图 2.7 最左推导 2 的语法树
在这里插入图片描述

图 2.6 的语法树先做乘法,而图 2.7 的语法树先做加法,到底先做何种运算呢?此处出现的这种现象称为文法的二义性。
如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义性的。或者说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义性的
上述文法 G [ E ]就是一个二义性的文法。

显然,二义性的文法将给编译程序的执行带来问题。对于二义性文法的句子,当编译程序对它的结构进行语法分析时,就会产生两种甚至更多种不同的理解。由于语法结构上的不确定性,将必然会导致语义处理上的不确定性。例如在上例中,当编译程序分析句子 i * i + i 时,是按图 2.6 去进行分析,还是按图 2.7 去进行分析?为使编译程序对每个语句的分析是唯一的,希望描述语言的文法是无二义性的。当然,对于二义性文法,我们可以利用文法的等价性来消除文法的二义性


http://chatgpt.dhexx.cn/article/mjmh83S9.shtml

相关文章

编译原理(三)语法分析:3.二义性与二义性的消除

文章目录 一、二义性1.定义2.原因 二、二义性的消除1.改写二义文法为非二义文法(1)步骤(2)例子(3)缺点 2.为文法符号规定优先级和结合性3.修改语言的语法(表现形式被改变) 【编译原理…

二义性和C++消除二义性

1.二义性 二义性的定义是:“如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。”(该定义来自于百度百科)用通俗的话讲,如果一句话或者一个…

C++ 二义性是什么?怎么解决?

一、什么是二义性 在多继承的场景里,当父类中存在同名变量时,子类访问父类的同名变量,将出现二义性,因为编译器不知道你将要访问的是哪个父类中的变量。 举个例子: class A { public:int a; // B1,B2 都…

ES6一维数组去重,合并去重方法分享

ES6去重的几个小方法 1.使用set方法 2.setArray.from() 3.filtermap 4、Array.fromsetflatsort 排序去重 flat:对数组进行扁平化处理 sort:排序 b-a:倒序 a-b:正序 5.数组合并去重

[记录]es6常用去重方法(数组、字符串)

数组去重 ES6 ES6以下方法除了代码简洁外,对于undefined和NaN也同样可以达到去重的效果 new Set()是ES6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合,Set本身是一个构造函数,用来生成 Set 数据结构。 Set搭配扩展运算符 ……

JavaScript数组去重—ES6的两种方式

说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代码可是足…

ES6 Set() 数组去重

ES6 Set()去重 Set。它类似于数组,但是成员的值都是唯一的 通过add()方法向 Set 结构加入成员 let arr [1,2,3,4,1,5,2,3]; var set2 new Set(); arr.forEach(item>{set2.add(item) }) console.log(set2); console.log(Array.from(set2));let str [测试1,测试…

ES6数组去重的三个简单办法

ES6数组去重的三个简单办法 简单说一下利用ES6实现数组去重的三个办法。 第一种: 利用Map对象和数组的filter方法 贴上相关代码 打印后的结果 通过打印我们发现,确实实现了我们想要的效果。那么下面简单来解释一下。 1.Map对象是ES6提供的一个新的数据结构&…

一文弄懂Python中的*args 和 **kwargs

1. 引言 在本文中,我们将讨论 Python 中的 *args 和 **kwargs 及其用法和示例。 闲话少说,我们直接开始吧。 2. 问题引入 在Python中写函数的时候,我们经常需要给函数传值,这些值被称为函数参数。 我们不妨来举个栗子&#xff…

**kwargs python_python中**kwargs怎么用?

1、使用两个星号是收集关键字参数,可以将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:>>> def print_kwargs(**kwargs): ... print(kwargs) ... >>> pr…

Python技巧:​args 和 kwargs 原来这么强大

大家好,今天我给大家分享Python技巧:​args 和 kwargs的相关技巧。喜欢记得收藏、关注、点赞。 注:完整代码、资料、技术交流文末获取 现在args和 kwargs参数仍然是 Python 中非常有用的特性,而且理解它们的威力将使您成为更有效…

*args和**kwargs是什么意思

去面试的时候,做了一道笔试题——什么是*args和**kwargs,区别在哪里? 有点蒙,好像见过,但是不知道具体的意思。所以回来查了一下资料,做一下笔记。 总的来说,*args代表任何多个无名参数&#x…

埃及分数c语言设计,埃及分数(四)

最优分解 源程序 下面就是求埃及分数最优分解的 C 语言源程序 EgyptianFraction.c: 1: #include 2: #include 3: #include 4: 5: const int SIZE 64; 6: static int wp -1, bp -1; 7: static mpz_t z, w, work[SIZE], best[SIZE]; 8: static mpq_t q1, q2; 9:…

埃及分数问题

问题描述: 古埃及人喜欢用最少的分子为 1 的真分数来表示一个真分数,比如7 / 8 1 / 2 1 / 3 1 / 24 。设计程序把一个真分数表示为最少的埃及分数之和的形式。 思路: 首先要知道什么是真分数:真分数是指大于0小于1的所有分数。这些分数的特…

贪心算法之埃及分数问题

1.问题:给定一个分数,如7/8,我们可以把它表示为1/2 1/3 1/24,埃及分数问题即把一个真分数表示为最少的埃及分数之和的形式,输入一个真分数把其分解为埃及分数之和。 2.设计思路:设分数为a/b,则cb/a,db%a,…

【数模】相关性分析

相关性:如果一个变量的变化引起了另一个变量的变化 目录 一、四种基本变量 二、 相关性分析方法 1.Pearson相关系数 2.Spearman 等级相关系数 3.Kendall tua-b 等级相关系数 4.卡方检测 5.Eta系数 *SPSS操作 三、偏相关 1.SPSS操作 2.偏相关系数和检验&…

数学建模-相关性分析及热力图

目录 一、相关性分析 二、相关性分析实例 三、三种相关系数 3.1 Pearson线性相关系数 3.2 Kendall tau系数 3.3 Spearman相关系数 4、Matlab代码 4.1 Pearson 显著性检验 4.2 Pearson 相关系数矩阵 4.3 Kendalltau相关系数矩阵 4.4 Spearman相关系数矩阵 5、代码…

R语言基础——简单相关性分析(1)

简单相关性分析(1) 简介1. 协方差和相关系数1.1 协方差1.2 相关系数 2. 相关性分析参考 简介 初次接触相关性分析,在摸索中前进,也顺便将笔记记录下来,未雨绸缪嘛! 简单来说,相关性分析就是衡量…

分类变量、有序变量与数值变量相关性分析方法总结及 R 语言应用

文章目录 一、分类 & 分类相关性分析二、有序 & 有序相关性分析三、数值 & 数值相关性分析四、分类 & 有序相关性分析五、分类 & 数值相关性分析六、有序 & 数值相关性分析 本文全部假设显著性水平为0.05,特殊说明的除外。 一、分类 & …

数据分析方法和思维—相关性分析法

01 写在前面 在数据分析的问题中, 经常会遇见的一种问题就是相关的问题, 比如抖音短视频的产品经理经常要来问留存(是否留下来)和观看时长, 收藏的次数, 转发的次数, 关注的抖音博主数等等是否有相关性, 相关性有多大。 因为只有知道了哪些因素和留存比较…