编译原理(五)自底向上分析之算符优先分析法

自底向上分析之算符优先分析法

说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。

基本过程

1. 一般方法:采用自左向右地扫描和分析输入串,从输入符号串开始,通过反复查找当前句型的句柄(最左简单短语),并利用有关规则进行规约。

分析过程如下,关键步骤是第一点!

  • 找出当前句型的句柄 x (或句柄的变形);
  • 找出以 x 为右部的规则 X::= x ;
  • 把 x 规约为X,产生语法树的一枝。

2. 自底向上分析也叫作移进-规约分析,简单的例子中,识别句柄的过程,主要看栈顶符号串是否形成规则的右部。这种做法形式上正确,但实际上不一定正确。原因:不能认为对于句型xuy,若有U::=u,就断定u是简单短语或者u是句柄,也就是说这是一个必要不充分条件。

算符优先分析(OPP)

1. OPP:简单直观,广为使用的自底向上分析方法,易手工实现。可用于一大类上下文无关文法。

分析器的结构:符号栈、优先关系矩阵、分析程序。

2. 特点:预先规定相邻终结符之间的优先关系,利用优先关系确定句型的“句柄”并进行规约。

注意:

  • 这里的“句柄”有可能不是真正的句柄,这种规约也未必是严格的最左规约。(后续解释)
  • 对于二义性文法,如 \(E ::= E+E | E-E | E*E | E/E | (E) | i\),可以通过定义优先关系和左结合原则,OPP可分析之。

3. 终结符之间优先关系定义

  • a = b:a的优先级等于b
  • a < b:a的优先级小于b
  • a > b:a的优先级大于b

注意: 这个关系是单方面的,也就是说这里的 “a<b” 并不意味着 “b>a”,同样的,“a=b” 也不意味着 “b=a”。

4. 优先关系举矩阵:左终结符(栈内)、右终结符(栈外),值为优先关系,空表示两个终结符不能相邻。

使用方法:当栈顶项(或次栈顶项) 终结符的优先级大于栈外的终结符的优先级则进行规约,否则移进。

出错情况:

  • 相邻终结符之间无优先关系。
  • 对双目运算符进行规约时,符号栈中无足够项。
  • 非正常结束状态。

5. 优先函数:文法终结符之间的优先关系可以不用矩阵表示,而是采用两个邮箱函数来表示:f(x)表示栈内优先函数,g(x)表示栈外优先函数。把优先关系的比较转换成数值的比较。

特点:优先函数值不唯一,只要相互之间数值大小表示优先关系就行。

优点:节省内存空间,易于比较(数值比较)

缺点:可能掩盖错误,由于优先关系变为数值,原先可能不存在的优先关系现在也可比较了。可以通过特判避免这个问题。

OG与OPG定义

1. 算符文法(OG):若文法G中没有形如 \(U ::= ···VW···\) 的规则(V,W∈Vn),则称G为算符文法。

直观理解:算符文法不允许两个非终结符相邻!

2. 优先关系定义:设嗡文法G是一个OG文法,a,b∈Vt,U,V,W∈Vn。

  • a = b: iff 文法中有形如 \(U∷=…ab…\)\(U∷=…aVb…\) 的规则。

  • a < b: iff 文法中有形如 \(U∷=…aW…\) 的规则,其中 \(W =+> b…\)\(W =+> Vb…\)

  • a > b: iff 文法中有形如 \(U∷=…Wb…\) 的规则,其中 \(W =+> …a\)\(W =+>…aV\)

TIP:只是定义,第二第三条实际用起来真的难用,还是继续看下去,用FIRSTVTLASTVT高级操作吧!

3. 算符优先文法(OPG):设有一OG文法,如果在任意两个终结符之间,至多只有上述关系中的一种,则称该文法为算符优先文法(OPG)。

构造优先关系矩阵

1. 通过检查每一条规则,'=' 优先关系很容易求得,但是 '>' 和 '<' 就复杂了,需要引入两个集合辅助:FIRSTVT、LASTVT。

FIRSTVT( U ) = { b | U =+> b…或U =+> Vb…, b∈Vt , V∈Vn}

LASTVT( U ) = { a | U =+> …a 或U =+> …aV, a∈Vt , V∈Vn}

若文法有规则形如 \(W∷= ...a U...\),对任何 b∈FIRSTVT( U ),则有: a < b。

若文法有规则形如 \(W∷= ...U b...\),对任何 a∈LASTVT( U ),则有: a > b。

2.构造FIRSTVT集合

  • 若有规则 U∷= b… 或 U∷= V b…,则 b∈FIRSTVT(U);
  • 若有规则 U∷= V… 且 b∈FIRSTVT(V), 则 b∈FIRSTVT(U)。

3.构造LASTVT集合

  • 若有规则 U::=…a 或 U::=…aV,则 a∈LASTVT(U);
  • 若有规则 U::=…V,且 a∈LASTVT(V) ,则 a∈LASTVT(U)。

4.构造算符优先矩阵

FOR 每条规则U::= x1 x2…xn DOFOR i:=1 TO n-1 DOBEGINIF xi和xi+1均为终结符, THEN 置 xi=xi+1IF i≤n-2,且xi和xi+2都为终结符号但xi+1为非终结符号 THEN 置 xi=xi+2IF xi为终结符号xi+1为非终结符号 THENFOR FIRSTVT(xi+1)中的每个b DO 置xi<bIF xi为非终结符号xi+1为终结符号 THENFOR LASTVT(xi)中的每个a DO 置a>xi+1END

5. 举个例子

1152056-20180118134805381-1435501176.png

分析句子 \(i*(i+i)\)

1152056-20180118143717521-483738205.png

分析算符优先分析法

1. 提出问题:这种分析算法并不是严格的最左规约,也就是说,每次规约的未必是当前句型的句柄。那它规约的是什么?

答案:最左素短语

先给出分析过程的特点(不予证明):

  • 每次规约的最左子串,确实是当前句型的最左素短语;
  • 规约的不都是真正的句柄(有时候是只是偶然);
  • 没有完全按规则进行规约,因为素短语不一定是简单短语(有时候是只是偶然)

2. 素短语:句型的素短语是一个短语,它至少包含有一个终结符号,并且除它自身以外不再包含其它素短语。

例如:对于句型T+TF+i,通过语法树可以轻易找到所有短语:① T + T F + i;② T + T * F;③ T;④ T * F;⑤ i。①包含其它短语②包含其它短语③不包含终结符④是素短语⑤是素短语。最后最左素短语就是④T*F。然而该句型的句柄确实③T。

3. 形式化寻找最左素短语:设有OPG文法句型:#N1 a1 N2 a2…Nn an Nn+1 #,其中Ni为非终结符(可以为空),ai为终结符。

定理:一个OPG句型的最左素短语是满足下列条件的最左子串:Nj aj … Ni ai Ni+1,其中aj-1 < aj ,aj = a . . . . j+1 , aj+1 = aj+2 , … , ai-2 = ai-1 , ai-1 = ai, ai.> ai+1。

4. 实现算符优先分析法:找句型的最左子串(最左素短语)并进行规约。

具体实现:当栈内终结符的优先级<或=栈外终结符的优先级时,移进;当栈内终结符的优先级>栈外终结符的优先级时,表明找到了素短语的尾,再往前找其头,并进行规约。

引用说明

- 邵老师课堂PDF
- 《编译原理级编译程序构造》

转载于:https://www.cnblogs.com/AlvinZH/p/8309259.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做Android开发,要清楚init.rc里面的东西

init.rc 复习看这个之前&#xff0c;先看看大神总结的文章这篇文章总结的非常到位&#xff0c;但是因为代码不是最新的Android版本&#xff0c;对我们最新的Android版本不适用。http://gityuan.com/2016/02/05/android-init/#init rc文件拷贝拷贝其实也就是把文件放到机器的某个…

宏比较值,坑的一B

昨晚上&#xff0c;我准备睡觉&#xff0c;连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…

Linux下Samba服务器搭建

linux文件共享之samba服务器 ——ubuntu 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 关闭LINUX防火墙命令&#xff1a; #ufwdisable 然后就在windows下ping一下linux的IP&#xff0c;如果能ping通&#xff0c;就可以继续下面的内容&#xff0c;如果p…

搞懂C++为什么难学,看这篇就够了!

学C能干什么&#xff1f; 往细了说&#xff0c;后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说&#xff0c;构成一个工程师核心能力的东西&#xff0c;都在C里。跟面向对象型的语言相比&#xff0c;C是一门非常考验技术想象力的编程语言&#xff0c;因此学习起…

看图学源码之FutureTask

RunnableFuture 源码学习&#xff1a; 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现&#xff0c;包括启动和取消计算的方法&#xff0c;查询计算是否完成以…

单片机的引脚,你都清楚吗?

第1课&#xff1a;单片机简叙1.单片机可以做什么&#xff1f;目前单片机渗透到我们生活的各个领域&#xff0c;几乎很难找到哪个领域没有单片机的踪迹。小到电话&#xff0c;玩具&#xff0c;手机&#xff0c;各类刷卡机&#xff0c;电脑键盘&#xff0c;彩电&#xff0c;冰箱&…

Graphviz的安装及纠错

在Anaconda Prompt里边输入conda install graphviz 安装成功之后输入pip install graphviz 它会提示成功安装。 启动 Jupyter Notebook &#xff0c;在文件里边输入 import graphviz 测试&#xff0c;如果没有报错证明&#xff0c;模块安装成功&#xff0c;但是在运行程序…

sklearn——决策树

总结sklearn决策树的使用&#xff0c;方便以后查阅。1.分类决策树 &#xff08;基于CART树&#xff09; 原型&#xff1a;参数&#xff1a;2、回归分类树 原型&#xff1a;参数&#xff1a;3、export_graphviz 当训练完毕一颗决策树时&#xff0c;可以通过sklearn.tree.expor…

Linux下SVN服务器的搭建

Linux下SVN服务器的搭建 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、下载工具&#xff08;下载地址&#xff1a;&#xff09; subversion-1.6.1.tar.gz subversion-deps-1.6.1.tar.gz 2、解压两个包&#xff1a; a) tar -xzvf subvers…

记一次解决问题的掉坑过程

这两天在调试一个音频ADC 芯片&#xff0c;也是之前的项目&#xff0c;但是一直调不出来&#xff0c;我发现我总是在这样的问题上纠结很久&#xff0c;以前踩过的坑后面照样会踩&#xff0c;只不过踩完会迅速把脚拉出来继续前进&#xff0c;我经常听到有人说「做嵌入式真的太容…

sklearn——AdaBoost应用

选自《python大战机器学习》

面试常见的C语言字符串操作

#字符串倒序输出实现逻辑&#xff0c;通过strlen获取字符串长度&#xff0c;然后通过 len/2 进行交叉赋值&#xff0c;这里需要注意&#xff0c;不需要考虑len是奇数还是偶数的问题。如果len是奇数&#xff0c;最后一个字符就不需要倒序&#xff0c;如果是偶数&#xff0c;最后…

HttpHandler:给指定路径下的图片添加水印显示

圣诞节&#xff0c;25日&#xff0c;要交ACCP5.0认证的项目&#xff0c;其中有这样一个要求&#xff1a;书店的所有图书的封面放在了\images\convers\下面&#xff0c;要求所有引用这一路径下的图片都添加书店的店名水印图片。就是说拦截Http请求了&#xff0c;自然想到HttpHan…

Linux 下的复制命令,这几个比较靠谱

平时我们使用Linux复制命令的时候&#xff0c;一般使用 cp命令&#xff0c;但是cp 命令性能比较令人担忧使用tar 命令来拷贝大量文件通过对比下面的几个命令&#xff0c;在拷贝比较多而且比较大的文件的话&#xff0c;用git clone 比较靠谱&#xff0c;特别是复制代码库&#x…

Mendeley文献管理软件使用介绍

<!DOCTYPE html>New DocumentMendeley 是一款免费的跨平台文献管理软件&#xff0c;同时也是一个在线的学术社交网络平台。Mendeley 对 PDF、Bibtex 的支持非常好&#xff0c;可以直接导出 Bibtex 格式&#xff0c;还可以直接导入zotero数据库&#xff0c;决定了其兼容性…

过拟合问题——正则化方法

看了很多资料&#xff0c;本身想放一个正则化的概念的&#xff0c;实在不敢放&#xff0c;怕吓跑一堆人&#xff0c;所以&#xff0c;将就吧。首先&#xff0c;我们知道正则化&#xff08;Regularization&#xff09;是解决过拟合问题的&#xff0c;简单来说&#xff0c;过拟合…

CentOS 8明年正式停止维护,以后再也不会有免费的RHEL了!

CentOS 8 明年正式停止维护&#xff0c;以后再也不会有免费的 RHEL 了!CentOS 是 Community Enterprise Operating System&#xff08;社区企业操作系统&#xff09;的首字母缩写&#xff0c;是 100&#xff05; 重建的 RHEL&#xff08;红帽企业 Linux&#xff09;。尽管 RHEL…

Python sqlalchemy orm 多外键关联

多外键关联 注&#xff1a;在两个表之间进行多外键链接 如图&#xff1a; 案例&#xff1a; # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, ForeignKey, String, Column# 调用基类Base from sqlalchemy.ext.declarative import dec…

将DataFrame格式的数据存入到mysql数据库中

因为最近频繁操作数据库&#xff0c;特别是写入数据比较麻烦。在DataFrame格式或者是Series格式的数据处理之后&#xff0c;总是会面临写入数据&#xff0c;迫不得已只能进行格式转换&#xff0c;搜索过程中发现了to_sql&#xff08;&#xff09;函数&#xff0c;就百度了用法&…

从小米智能家居入手,揭秘物联网关键技术

物联网已不知不觉融入我们的生活中给我们带来便捷&#xff0c;比如&#xff0c;智能门锁、ETC 电子自动收费系统等&#xff0c;一开始感觉还挺很新奇的&#xff0c;现在也习以为常了。那到底什么是物联网&#xff1f;可能很多人还挺蒙圈的。所谓物联网&#xff0c;最终目的就是…