编译原理:文法及其二义性(判定及消除)
(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419
学编译原理时,会学到文法,老师在介绍完文法的相关定义后又介绍了文法的二义性,但是没说到底是如何避免文法的二义性的。
这篇博文就是我的学习结果
文法的二义性:如果文法G中的某个句子存在不只一棵语法树,则称该句子是二义性的。如果文法含有二义性的句子,则称该文法是二义性的。
我举个例子,来说明文法的二义性及其避免方法:
有下面这个文法:
S - >S and S | S or S | not S | p | q | (S)
那么要是得到 not p and q:
其推导过程如下:都用最左推导
A、S -> not S
-> not S and S
-> not p and S
-> not p and q
B、S -> S and S
-> not S and S
-> not p and S
-> not p and q
显然这两个推导过程不同,说明与两个过程相对应的语法树也不同,所以,此文法具有二义性。
那么怎么修改呢?
这就到了消除二义性的方法了:
1、人为规定其中的“not”,“and”,“or”的优先级
依照此法,可将上述文法修改为:
S -> S or T | T
T -> T and F | F
F -> not F | (E) | p | q
2、第二种方法就是重写文法
文中的文法例子来源于:https://blog.csdn.net/chunjiekid/article/details/82319161,这个博客是我在寻找方法的时候学习的,但是他写的没我的详细,哈哈!
编译原理:文法及其二义性(判定及消除)相关推荐
- #编译原理# 文法和内容(二)
文法和内容 编译原理笔记第二部分,内容参考:北航软院教师邵兵课堂课件及内容.张莉著<编译原理及编译程序构造>.国防工业出版社的<编译原理--学习指导与典型题解析>.AlvinZ ...
- 编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
需要原卷和答案请点赞关注收藏后评论区留言私信~~~ 下面对编译原理中一些常见的概念以及算法小题的讲解,这部分可能单独出题考试,也有可能混在大题中出现 一.编译器结构 题目如下 The phases o ...
- 编译原理——文法的基本概念
文法的概念 每一种自然语言或者是编程语言都需要文法来描述,文法相当于语言学的语义分析,即分析每一句话所表示的含义,编译器需要利用文法来完成其语法分析和语义分析. 在目前编程语言领域,上下文无关文法作为 ...
- 编译原理-正则文法与正则表达式的相互转化
正则文法与正则表达式的相互转化 前言 一.正则文法 1.定义 2.例子 二.正则表达式 1.定义 2.例子 三.转换规则 1.正则文法转换为正则表达式 2.正则表达式转换为正则文法 四.转换例子 1. ...
- 编译原理实验c语言cfg文法,编译原理
地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...
- 编译原理学习笔记:CFG的分析树(句型的短语、二义性文法、二义性文法的判定)
1 CFG的分析树 2 分析树是推导的图形化表示 3 (句型的)短语 4 二义性文法 5 二义性文法的判定
- 编译原理(三)语法分析:3.二义性与二义性的消除
文章目录 一.二义性 1.定义 2.原因 二.二义性的消除 1.改写二义文法为非二义文法 (1)步骤 (2)例子 (3)缺点 2.为文法符号规定优先级和结合性 3.修改语言的语法(表现形式被改变) [ ...
- 编译原理——证明文法的二义性(1)
目录 推导和语法树 推导 语法树 文法二义性 在证明文法的二义性之前,我们需要熟悉几个基本的概念. 推导和语法树 推导 这里的推导,简单的来说就是指根据给出的句型(句子),对文法进行推理变化最终得到句 ...
- 【编译原理】-- 第二章(二)(短语、简单短语、句柄、文法二义性、语法树、例题)
目录 一.句型的分析 1.规范推导和规范归约 2.短语.简单短语和句柄 3.语法树 4.通过树来寻找短语.简单短语.句柄 二.文法的二义性 1.文法二义性的定义 2.文法二义性的消除 (1)定义规定或 ...
最新文章
- BCH压力测试即将开始,你确定不来凑凑热闹?
- More about Tair (NoSql)
- 15 个最佳的 jQuery 表格插件
- 谷歌正式宣称“量子霸权”:意义堪比莱特兄弟的第一次飞行
- 思考--为何早晨型人更容易成功
- Java培训教程之对象的创建与使用
- jzoj4249-游戏【贪心】
- 随机获取图片的api接口
- (超简单)Nginx状态统计模块
- HTML Parsing Error KB927917
- Centos 搭建DNS服务器
- 音乐网站搭建源码Sourcecode
- NLP 语料库 大全
- dokuwiki之新增/删除页面(文章)(一)
- 黎明前的黑夜如此漫长
- 怎样才能叫高级程序员?
- ARC093 F - Dark Horse
- 留学生 电脑安全与维护手册 (留学须知)
- 并发编程之 ThreadLocal 源码剖析
- 心路历程 致正在为梦想奋斗的自己
热门文章
- php最大并发数,php内置开发服务器的最大并发连接数
- linux测试手柄,Linux Joystick 介绍
- java jdbc 连接mysql数据库,Java 通过JDBC连接Mysql数据库
- 大数据计算存储资源池_管家实践:轻松玩转大数据计算服务
- 使用maven 创建Quartz 任务示例_01
- idea 提示接口注释信息
- 第六篇:Spring Boot 访问静态资源
- sqlite3的编译和使用
- python-pyinstaller打包程序为exe
- datagridview选中获取行号_DataGridView控件显示行号的正确代码及分析