编译原理——证明文法的二义性(1)

article/2025/10/14 20:36:40

目录

    • 推导和语法树
      • 推导
      • 语法树
    • 文法二义性

在证明文法的二义性之前,我们需要熟悉几个基本的概念。

推导和语法树

推导

这里的推导,简单的来说就是指根据给出的句型(句子),对文法进行推理变化最终得到句型(句子)的过程。
其中,最左(右)推导是在每次推导的过程中,将最左(右)部的非终结符替换成目标句型的一部分,直到完全替换成目标句型。

例:有文法G[S]:
S—>AB
A—>bB
B—>a|Sb
对于句型baSb,
最左推导为:S=>AB=>bBB=>baB=>baSb
最右推导为:S=>AB=>ASb=>bBSb=>baSb

语法树

对句型的推导过程给出一种图形表示,这种表示成为语法树,也成为推导树。
例:对于上述文法的句型的语法树之一为:

语法树

文法二义性

如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义性的。具体来说就是一个一个文法的某个句子能有两个不同的最右(左)推导。证明了这一点,就可以说该文法是具有二义性的。

例:设有文法G[S]:S—>iSeS| iS | i ,证明文法G[S]有二义性
证明:(首先我们得自己假设一个句子,构建该句子的语法树)
设句子为iiiei ,则:
最右推导一:S=>iS=>iiSeS=>iiSei=>iiiei
最右推导一

最右推导二:S=>iSeS=>iSei=>iiSei=>iiiei
最右推导二
因此,该文法存在一个句子有两个不同的最右推导,具有二义性。

参考资料:编译原理(第四版)


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

相关文章

二义性

自然语言的二义性什么意思 面这个问题.很清楚的说明了自然语言的二义性.. 用红墨水写一个“蓝”字,请问,这个字是红字还是蓝字? 可能很少有人意识到,像红字和蓝字这样的词语都存在着二义性。可能是红色的字,也可能是“…

2.5.2 文法的二义性

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⇒…

编译原理(三)语法分析: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. 相关性分析参考 简介 初次接触相关性分析,在摸索中前进,也顺便将笔记记录下来,未雨绸缪嘛! 简单来说,相关性分析就是衡量…