编译原理(三)语法分析:3.二义性与二义性的消除
文章目录
- 一、二义性
- 1.定义
- 2.原因
- 二、二义性的消除
- 1.改写二义文法为非二义文法
- (1)步骤
- (2)例子
- (3)缺点
- 2.为文法符号规定优先级和结合性
- 3.修改语言的语法(表现形式被改变)
【编译原理博客列表】》》》》》》
一、二义性
1.定义
定义3.7
若文法G对同一句子产生不止一棵分析树,则称G是二义的。
例3.7 句子id+id*id和id+id+id可能的分析树
E→E+E | E*E |(E)| -E | id
深度越深,越远离开始节点,优先级越高。
非终结符在终结符(如+)的左边是左结合,右边是右结合。
“悬空(dangling)else”问题
例3.8 条件语句if x<3 then if x>0 then x:=5 else x:=-5
S → if C then S (1)
| if C then S else S (2)
| id := E (3)
C → E = E | E < E | E > E (4)…(6)
E → E + E | - E | id | n (7)…(10)
2.原因
原因:在产生句子的过程中某些直接推导有多于一种选择
注意:
明确最终分析树的形状,仅与文法有关,而与推导方法无关\textcolor{red}{最终分析树的形状,仅与文法有关,而与推导方法无关}最终分析树的形状,仅与文法有关,而与推导方法无关
一个句子有多于一棵分析树,是因为文法中缺少对文法符号优先级和结合性的规定。
二、二义性的消除
消除文法二义的两种方法:
① 改写二义文法为非二义文法;
② 规定二义文法中符号的优先级和结合性,使仅产生一棵分析树。
左结合性:
对于A→αAβ
,若A
(左右都有的非终结符)在终结符(即终结符在β中)左边出现,则A产生式具有左结合性质。
如:
E → E + T
是左结合(E
即A
,+
是终结符)。F → (E) | -F
是右结合(F
即A
,-
是终结符)
1.改写二义文法为非二义文法
(1)步骤
改写二义文法的关键步骤:
- 划分优先级和结合性
- 引入一个新的非终结符,增加一个子结构并提高一级优先级(优先级的判断);
- 递归非终结符在终结符左边,运算具有左结合性,否则具有右结合性。
(2)例子
例3.10 改写二义文法
E→E+E | E*E |(E)| -E | id
- 优先级从低到高:
[+]
;[*]
;[( ), -, id]
- 结合性:
左结合[+, *]
右结合[-]
无结合[id]
- 非终结符与运算:
E:+
(E产生式,左递归)
T:*
(T产生式,左递归)
F:-,( ),id
(F产生式,右递归)
E → E + T | T
T → T * F | F
F → (E) | -F | id
解决“悬空(dangling)else”问题
例3.8 条件语句if x<3 then if x>0 then x:=5 else x:=-5
S → if C then S (1)
| if C then S else S (2)
| id := E (3)
C → E = E | E < E | E > E (4)…(6)
E → E + E | - E | id | n (7)…(10)
分析原因:if-then-else和if-then:在一个复合if语句中,可能then多于else,使得else不知与哪个then结合。
一般原则是右结合,即else与其左边最靠近的then结合。
改写文法的根据是将S分为 完全匹配(MS) 和 不完全匹配(UMS) 两类,并且在UMS中规定 else右结合 。
S → MS (1)| UMS (2)
MS → if C then MS else MS (3)| id := E (4)
UMS→ if C then S (5) (G3.5)| if C then MS else UMS (6)
C → E = E | E < E | E > E (7)...(9)
E → E + T | T (10)...(11)
T → (E) | -T | id | n (12)...(15)
(3)缺点
- 非终结符的引入,增加了推导步骤(分析树增高)
- 更不容易理解
2.为文法符号规定优先级和结合性
YACC(生成 词法分析器 和 语法分析器 的工具)就是采用这种方法:
%left '+'
%left '*'
%right '-'
E : E '+' E | E '*' E | '-' E | '(' E ')' | id
简单
3.修改语言的语法(表现形式被改变)
① 明确给出结束标志,如Ada中用end if,于是有:
if x<3 then if x>0 then x:=5; end if; else x:=-5; end if;
if x<3 then if x>0 then x:=5; else x:=-5; end if; end if;
② 给表达式加括号,如Pascal中逻辑和算术运算:(a+b)>(c*d)
编译原理(三)语法分析:3.二义性与二义性的消除相关推荐
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print su ...
- 编译原理之语法分析(预测分析法)
编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...
- 编译原理2-Bison语法分析
ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...
- 编译原理——自上而下语法分析
自上而下分析面临的问题 回溯 (当候选有多个的时候,匹配失败会造成回溯) 文法左递归问题 那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中 LL1文法消除左递归 消除直 ...
- 编译原理之语法分析(自底向上)(包含源码)
编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...
- 编译原理词/语法分析
效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...
- 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf
// SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...
- 语言的二义性——编译原理
写这篇文章的初衷是在复习编译原理时,对于文法的二义性和语言的二义性的区别产生了疑问.其中对于语言的二义性的定义不甚理解,且国内网上的文章对于语言的二义性定义描述较为简单.因此,为了更好的理解语言的 ...
- 【编译原理】Python语法分析LL(1)、LR(1)
目录 一.实验目的 二.实验任务 三.实验原理 1 LL(1)文法 2 LR文法 四.实验过程 1 LL(1)文法 2 LR文法 五.实验结果 1 LL(1)文法 2 LR(0)文法 3 ...
- 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译
三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...
最新文章
- json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 问题解决
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...
- pid控制从入门到精通pdf_【应用指南】PID调节让流量/压力控制又快又稳
- 9、10、11、12、13_添加标注 (Annotations)、添加网格线(Grid Lines)、显示中文字体、保存图形(saving Figures)、高质量矢量图输出
- java ref 应用类型_Java四种引用类型
- mysql php 变量赋值,在MySQL UPDATE(PHP / MySQL)中使用变量
- 字节跳动 8 年,抖音、头条的技术能力开发者都可以用起来了!
- 8.Redis主从复制
- 微信小程序自定义函数返回值
- 网易云音乐用户信息爬取以及可视化
- 【期末复习】计算机组成原理 袁春风
- 祝贺自己获得CSDN2018 博客之星
- 第一个安卓app应用的开发--环境配置和第一项目创建
- 打印机驱动无法安装到计算机是,打印机驱动在电脑哪个位置 打印机驱动安装不上怎么办【详解】...
- Typora添加参考文献
- 信号与系统2-连续离散系统时域分析
- Anchor-free目标检测综述 -- Dense Prediction篇
- (毕业设计资料)基于51单片机的公交自动报站系统
- 20141226-网易有道实习反思
- 程序猿电子书推荐和下载
热门文章
- cnn(卷积神经网络)比较系统的讲解
- 服务器文件夹共享到本地,云服务器共享本地文件夹
- 我的人生哲学(三十六岁版)
- 案例2:丙类仓库建筑防火案例分析
- 《胜负无定数,敢拼搏成七分》的读后感
- java控制台打印乱码_java控制台输出出现乱码怎么解决
- 推荐4个好用、接收邮件及时的临时邮箱
- 【转载】PCB设计方法和技巧
- zkeacms mysql_在Docker中运行纸壳CMS并配置使用MySql
- PX4源码分析__传感器数据“sensor_combined”的来龙去脉