编译原理-至下而上的语法分析

文章目录

  • 至下而上分析的基本问题
    • 归约
    • 短语
    • `规范归约`
    • 符号栈的使用
  • 算符优先分析
    • 优先关系
    • 算符文法及优先关表构造
    • 如何求FIRSTVT和LASTVT
    • 算符优先分析算法
    • 优先函数

至下而上分析的基本问题

归约

用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左部符号
E − > i ∣ E + E ∣ E − E ∣ E ∗ E ∣ E / E ∣ ( E ) {E -> i|E + E|E-E|E*E|E/E|(E)} E>iE+EEEEEE/E(E)
输入符号串:
i ∗ i + i {i*i+i} ii+i
归约过程
E ∗ i + i ( 1 ) {E*i+i} \quad \quad (1) Ei+i(1)
E ∗ E + i ( 2 ) {E*E+i} \quad \quad (2) EE+i(2)
E + i ( 3 ) {E+i} \quad \quad (3) E+i(3)
E + E ( 4 ) {E+E} \quad \quad (4) E+E(4)
E ( 5 ) {E} \quad \quad (5) E(5)
例子:设文法G(S):
S − > a A c B e {S->aAcBe} S>aAcBe
A − > b {A->b} A>b
A − > A b {A->Ab} A>Ab
${b->d} $
试对 a b b c d e {abbcde} abbcde进行移进归约分析:
能进行归约就进行归约不能进行归约进行移进
image
image
image
image
此时我们进行归约的话就会出现矛盾,b是第二个推导的产生式,Ab是第二个产生式的候选式,这里我们选择第二种进行归约
image
image
image
image
在不能归约时我们就移进
image

短语

定义:令G是一个文法,S是文法的开始符号,假定 α β δ {\alpha \beta \delta} αβδ是文法G的一个句型,如果有:
image
就称 β \beta β是句型 α β δ {\alpha \beta \delta} αβδ相对于非终结符 A {A} A的短语
如果有 A = > β {A => \beta} A=>β,则称 β \beta β是句型 α β δ {\alpha \beta \delta} αβδ相对于产生式 A − > B A->B A>B直接短语,一个句型的最左直接短语称为该句型的句柄
一个句型对应的语法树中

  1. 以某非终结符为根的两代以上的子树的所有末端结点从左到右排列就是相对于该非终结符的一个短语
  2. 如果子树只有两代,则改短语是直接短语

句柄可以被用来对句子进行归约

规范归约

定义:假定 α \alpha α是文法 G G G的一个句子,我们称序列
α n , α n − 1 , . . . , α 0 {\alpha_n, \quad \alpha_n-1, \quad ... \quad, \alpha_0} αn,αn1,...,α0
α \alpha α的一个规范归约,如果此序列满足:
1. α n = α {1. \alpha_n = \alpha} 1.αn=α
2. α 0 为文法的开始符号,即 α 0 = S {2. \alpha_0为文法的开始符号,即\alpha_0=S} 2.α0为文法的开始符号,即α0=S
3. 对于任何 i , 0 < i < = n , α i − 1 是从 α i 经句柄替换成相应产生式左部符号而得到的 {3.对于任何i, 0 < i<= n,\alpha_{i - 1}是从\alpha_i经句柄替换成相应产生式左部符号而得到的} 3.对于任何i0<i<=nαi1是从αi经句柄替换成相应产生式左部符号而得到的
规范推导:我们将规范归约的过程逆过来就是规范推导,规范推导也经常被称为最右推导
由规范推导推出来的句型被称为规范句型

符号栈的使用

  1. 栈是语法分析的一种基本数据结构, # \# #作为栈底符号
    文法 G ( E ) : G(E): G(E):
    E − > T ∣ E + T E->T|E+T E>TE+T
    T − > F ∣ T ∗ F T->F|T*F T>FTF
    F − > ( E ) ∣ i F->(E)|i F>(E)i
    输入串为 i 1 ∗ i 2 + i 3 i_1*i_2+i_3 i1i2+i3的分析过程
    image
    image
    image

算符优先分析

  1. 算符优先就是定义算符之间(终结符之间)的某种优先关系,借助优先关系来寻找可归约串和进行归约
    考虑二义文法 G ( E ) : i ∣ E + E ∣ E − E ∣ E ∗ E ∣ E / E ∣ ( E ) G(E) \quad: \quad i|E+E|E-E|E*E|E/E|(E) G(E):iE+EEEEEE/E(E)
    这个句子由几种不同的规范归约
    例如句子 i + i − i ∗ ( i + i ) i+i-i*(i + i) i+ii(i+i)的规约过程(按四则运算的优先顺序)
    ( 1 ) i + i − i ∗ ( i + i ) (1) \quad {i + i - i * (i + i)} (1)i+ii(i+i)
    ( 2 ) E + i − i ∗ ( i + i ) (2) \quad {E + i - i * (i + i)} (2)E+ii(i+i)
    ( 3 ) E + E − i ∗ ( i + i ) (3) \quad {E + E - i * (i + i)} (3)E+Ei(i+i)
    ( 4 ) E − i ∗ ( i + i ) (4) \quad {E - i * (i + i)} (4)Ei(i+i)
    ( 5 ) E − E ∗ ( i + i ) (5) \quad {E - E * (i + i)} (5)EE(i+i)
    ( 6 ) E − E ∗ ( E + i ) (6) \quad {E - E * (E + i)} (6)EE(E+i)
    ( 7 ) E − E ∗ ( E + E ) (7) \quad {E - E * (E + E)} (7)EE(E+E)
    ( 8 ) E − E ∗ ( E ) (8) \quad {E - E * (E)} (8)EE(E)
    ( 9 ) E − E ∗ E (9) \quad {E - E * E} (9)EEE
    ( 10 ) E − E (10) \quad {E - E} (10)EE
    ( 11 ) E (11) \quad {E} (11)E

优先关系

image

算符文法及优先关表构造

算符文法:一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部: . . . Q R . . . ...QR... ...QR...,则我们称该文法为算符文法
约定:
a 、 b 代表任意终结符 a、b代表任意终结符 ab代表任意终结符
P 、 Q 、 R 代表任意非终结符 P、Q、R代表任意非终结符 PQR代表任意非终结符
. . . 代表由终结符和非终结符组成的任意序列,包括空字 ...代表由终结符和非终结符组成的任意序列,包括空字 ...代表由终结符和非终结符组成的任意序列,包括空字

"等于":image
"小于":
image
"大于":
image
image
FIRSTYT:image

LASTVT:image
比较:
image
算符优先关系表
有了FIRSTVTLASTVT这两个概念后,我们就可以用算法构造优先关系表

image
我们只需对每个产生式检查一遍,把所有优先关系都找到就可以了

如何求FIRSTVT和LASTVT

image
image

算符优先分析算法

素短语:至少包含一个终结符,并且除了它自身外不包含任何更小的素短语,最左素短语就是句型最左边的素短语
我们考虑句型:
# N 1 a 1 N 2 a 2 . . . N n a n N n + 1 # \# N_1 a_1 N_2 a_2 ... N_n a_n N_{n+1} \# #N1a1N2a2...NnanNn+1#
其中每一个 a i a_i ai都是终结符, N i N_i Ni都是可有可无的非终结符。
一个算符优先文法G的任何上述句型的最左素短语是满足如下条件的最左子串 N j a j . . . N i a i N i + 1 {N_ja_j...N_ia_iN_{i + 1}} Njaj...NiaiNi+1
image
算法
image

优先函数

我们在通常实现上面算法的时候在判断优先关系的时候一般不采用查表的方法而是用两个优先函数,优先函数可以将原来 N ∗ N N * N NN的时间复杂度降低到 2 ∗ N 2 * N 2N,缺点是原来可能两个符号不可比较优先级,但是经过优先函数之后会映射到自然数从而导致可以比较,这样会导致一些错误
image
f被称为栈优先函数
g被称为比较优先函数
如何构造优先函数(证明过程略)
image
经过构造完的优先函数需要我们进一步检验是否正确

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP 52策略测试简介

我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。 52策略其实和50策略非常的相似。52策略就是按库存生产,创建完计划独立需求后的结果和50策略是一样的。 1、我们先看下50策略和…

从零基础到精通:Flutter开发的完整指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 第一部分&#xff1a;入…

Linux:给openlab搭建web网站

httpd服务器建立综合练习 建立网站需求&#xff1a; 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c; &#xff08;1&#xff09;、基于 www.openlab.com/stud…

LiveMedia视频监控汇聚管理平台功能方案之REST HTTP接口服务(六)

LiveMedia视频监控汇聚管理平台全面支持HTTP接口与其他系统对接&#xff0c;接口包含登陆、视频设备/组织结构添加、修改、删除、实时视频、录像回放、定位、设备控制、报警通知及报警联动等&#xff0c;第三方系统可以无缝的把视频中间件当作自身系统中的一个组件来调用和同步…

常用的软件测试组织架构模型

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;加入1000人软件测试技术学习交流群&#x1f4e2;资源分享&#xff1a;进了字节跳动之后&#xff0c;才…

Slax Linux 强化了会话管理和引导参数选项

导读Slax Linux 的创始人和维护者Tomas Matejicek 宣布 了他的微型和便携 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强和错误修复。 新的 Slax Linux 版本&#xff08;基于 Debian 的 12.1 版本和基于 Slackware 的 15.0.2 版本&#xff09;引入了在可写设备上运行发…

黑客通过ScreenConnect远程访问入侵医疗机构

导语&#xff1a;最近&#xff0c;安全研究人员发现黑客利用ScreenConnect远程访问工具对美国多家医疗机构进行攻击。这些威胁行为利用了Transaction Data Systems&#xff08;TDS&#xff09;使用的本地ScreenConnect实例&#xff0c;该公司是一家在全美50个州都有业务的药店供…

Monkey压力测试

环境搭建 提前下好java&#xff08;我的是java8&#xff09; https://www.androiddevtools.cn/ 下载Android SDK 解压后点击安装 可以使用雷神模拟器模拟手机连接 dumpsys activity activities | grep “mFocusedActivity”&#xff08;获取当前运行进程包名&#xff09; ex…

【数据结构—— 栈的实现(数组栈)】

数据结构—— 栈的实现 一.栈1.1栈的概念及结构 二.栈的实现2.1头文件的实现——&#xff08;Strck.h&#xff09;2.2 源文件的实现——&#xff08;Strck.c&#xff09;2.3 源文件的实现——&#xff08;test.c&#xff09; 三.栈的实际数据测试展示3.1正常的后进先出方式3.2 …

对自动化测试的一些展望与理解

1. 需求和目标 在我开展自动化测试之前&#xff0c;其实该项目以前的测试人员也已经写了很多的接口测试用例&#xff0c;但是大多数用例处于“半瘫痪”状态&#xff0c;在CI上无人维护&#xff08;听说起初是有人维护的&#xff0c;但是后来用例多了&#xff0c;维护的人每次花…

技术管理责任制度《一》

一、技术管理机构责任制 (1) 按各级技术人员的职责范围&#xff0c;分工负责&#xff0c;做好经常性的技术业务工作。 (2) 组织贯彻执行国家有关技术政策和上级办法的技术标准、规定、规程、和各项技术管理制。 (3) 负责收集和提供技术情报、技术资料、技术建议和技术措施等。 …

元宇宙时代,数字员工正成为企业服务的黄金担当!

未来&#xff0c;你的同事可能不是“人” 自2021年“元宇宙”爆火之后&#xff0c;作为连接现实世界和元宇宙的媒介之一&#xff0c;虚拟人开始大量跑步入场。伴随着虚拟数字人相关技术包括CG、语音识别、图像识别、动捕等的共同成熟&#xff0c;让数字虚拟产业在今年渐入佳境…

Rust-使用dotenvy加载和使用环境变量

系统的开发&#xff0c;测试和部署离不开环境变量&#xff0c;今天分享在Rust的系统开发中&#xff0c;使用dotenvy来读取和使用环境变量。 安装 cargo add dotenvy dotenv_codegen 加载环境变量 use dotenvy::dotenv;fn main() {dotenv().expect(".env不存在");…

公司让我开发一个管理系统,有了它,So easy!

目录 一、前言 二、低代码如何快速开发&#xff1f; 1.可视化开发 2.预构建的组件和模板 3.集成的开发和测试工具 4.跨平台兼容性 5.可伸缩性和可扩展性 三、前后端分离的开发框架 技术架构 一、前言 长期以来&#xff0c;常规软件开发是一项艰苦而详尽的工作。开发人员编写代表…

设计模式之适配器(Adapter)

Adapter Wapper 接口转换器 如果一个类不能直接访问另一个类的时候&#xff0c;中间加一个Adapter转换器就能访问了 常见例子: 电压转接头 java.io jdbc-odbc bridge(不是桥接模式) ASM Transformer java io里面的读文件操作: FileInputStream是字节流读文件&#xff0c;就像…

多线程JUC

创建线程的三种方法 runnable还需要通过currentthread来获取当前方法&#xff0c;才能使用Thread中的方法 第三种实现方法过程&#xff1a; 1.创建一个类MyCallable实现Callable接口 2.重写call (是有返回值的&#xff0c;表示多线程运行的结果) 3.创建MyCallable的对象 (表示多…

LLaMA模型之中文词表的蜕变

在目前的开源模型中&#xff0c;LLaMA模型无疑是一颗闪亮的⭐️&#xff0c;但是相对于ChatGLM、BaiChuan等国产大模型&#xff0c;其对于中文的支持能力不是很理想。原版LLaMA模型的词表大小是32K&#xff0c;中文所占token是几百个左右&#xff0c;这将会导致中文的编解码效率…

全国各区县平均降水月数据!多时间版本可查询

本周给大家推荐一些环境监测数据~ 今天分享的是全国平均降水数据~ 全国平均降水是指全国各个地区降水的平均值。这个值是通过收集和统计全国各地的降雨和降雪数据得出的。由于各地的气候条件和地形不同&#xff0c;因此全国平均降水并不是简单的平均数&#xff0c;而是根据各…

设计模式之原型模式(Prototype)

原型模式 如果已经有一个对象了&#xff0c;你想创建一个对象&#xff0c;而且对象里面的属性和已经存在的对象的属性差不多&#xff0c;就可以使用clone方法 克隆一个出来 实现原型模式需要实现标记型接口Cloneable -->标记型接口 : 里面没有需要实现的方法(空接口) 一般…

SQL学习之增删改查

文章目录 数据库数据类型建表create table插入数据insert into查询数据select from修改数据update set删除数据delete from备份ctas结果插入iis截断表 truncate table修改表结构alter table添加注释 注&#xff1a;本文的SQL语法是基于Oracle数据库操作的&#xff0c;但是基本的…
最新文章