编译原理2

推导和短语

推导

推导过程中,每一步推导都是对句型的 最右非终结符 进行替换,最右推导(规范推导)

短语

用 β 替换 A,则 β 就是 关于A 的一个短语

直接短语是短语范围内的一步推导;

直接短语可能不唯一,但 最左直接短语 唯一确定,被称为句柄; 

例:通过推导过程找出短语和句柄

 素短语
(1) 是短语
(2) 至少包含一个终结符
(3) 不再包含其它素短语

找素短语的方法有:

找短语中最短的判断是否有终结符,若有则该短语是素短语;然后判断其他短语有是否有该素短语,若有,则其他短语不是素短语,若没有,则进一步判断是否有终结符,若有,则是,反之则不是;

以上例题中,a 和 Sb 是素短语;

语法树

基本特点和定义

1)根结点是文法开始符号;

2)内部结点一定是非终结符;

3)若某结点为ε,则该结点是叶子结点,并且其父结点无其他子结点;

根据一棵语法树无法判断是 最右推导 还是 最左推导

短语:每个子树的叶子结点组成的符号串;

直接短语:简单子树(单层分支的子树)的 叶子结点 组成的字符串是相对于简单子树根的直接短语

句柄:最左简单子树的 叶子结点组成的字符串

素短语:子树的叶子节点组成的字符串包含终结符,且在子树中不再有包含终结符的最小子树


证明某文法二义性?

找出二义性的句子 / 句型(若某个句子能够找到两种不同的最左/右推导或者存在两棵不同的语法树)


自顶向下的语法分析

1.不确定的自顶向下语法分析

   根据多个公共因子的候选式进行不确定的试探,出现错误会回溯,效率低

2.确定的自顶向下语法分析--消除左递归 消除回溯

   1) 递归下降分析法;

   2)LL(1)分析法;

消除左递归(直接左递归)
将产生式 A → Aα | β   改写为: A → βA'       A' → α A' | ε
其中, A' 新引入的非终结符 ε 不可缺少,否则推导过程无 法结束;
例:含有直接左递归的表达式文法G[E]为
G[E]:
E → E+T | T  - -存在左递归
T → T*F | F   - -存在左递归
F → (E) | i
经过消去直接左递归后得到文法 G'[E]
E → TE'
E' → +TE' | ε
T → FT'
T' → *FT' | ε
F → (E) | i
A → Aα 1 | Aα 2 | … | Aα m | β 1 | β 2 | … | β n 消除其直接左递归如下:
A β 1 A' β 2 A' ∣…∣ β n A'
A' α 1 A' α 2 A' ∣…∣ α m A' ε
例如,对产生式 E →E+T | E -T | T ,消除直接左递归后为
E TE'
E' +TE' | - TE' | ε
消除间接左递归
G[S]: S → Q c | c
Q → R b | b
R → S a | a
中的 S Q R 都具有间接左递归
S Qc Rbc Sabc
通过分配律将间接左递归化作直接左递归:
Q →  ( Sa | a ) b | b 展开后: Q → Sab | ab | b
再将改变后 Q 的产生式代入到 S 的产生式中并按分配律展开得
S →  ( Sab | ab | b ) c | c
展开后: S →  Sabc | abc | bc | c   
消除直接左递归 S->abcS' | bcS' | cS'    S'->abcS' | ε  (略有疑问)
回溯

候选式中存在公共的左因子;

A → δβ1 | δβ2 | … | δβi | βi+1 | … | βj 消除回溯,经过反复提取左因子,就能把每个非终结符(包括新引进者)的所有候选首字符集变为两两不相交(即不含公共左因子):

A δA' β i+1 ∣…∣ β j
A' β 1 ∣…∣ β i
例:对文法 G[A]: A →  aAB | a | b 提取公共左因子后的文法 G' [A] ?
G ' [A]: A →  aA ' | b
A' → AB | ε
递归下降分析器 

要求:消除左递归; 消除回溯; 

递归子程序法对应的是最左推导过程;

LL(1) 分析法

L :    自顶向下分析是从左向右扫描字符串的;

L :    分析过程用最左推导;

(1):   只需要向右查看一个符号就可决定如何推导;

LL(1)分析器是由 LL(1)分析表、分析栈和一个控制程序组成;

分析栈要求逆序入栈

First集合是 针对第一个位置的终结符 ; 并且是针对产生式的左端非终结符考察的;

Follow集合是针对产生式的右端非终结符考察的;

例1:

例2:修正等价的LL(1)文法

注:S的 first 集只有 i  而无分号 

 例3:

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

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

相关文章

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

Sentinel实现区分来源

要区分来源就要写代码实现RequestOriginParser接口 ,注意是要实现com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser 接口,别搞错接口了。 MyRequestOriginParser.java package com.codex.terry.sentinel.origin;import com.ali…

STM32mp157aaa按键中断实验

效果图&#xff1a; 源码&#xff1a; #include "key.h" void hal_key1_rcc_gpio_init() {// 使能GPIOF组RCC->MP_AHB4ENSETR | (0x1 << 5);// 设置引脚位输入模式GPIOF->MODER & (~(0X3 << 18));GPIOF->MODER & (~(0X3 << 16))…

当Matplotlib遇见SciencePlots

分享一个Matplotlib扩展工具SciencePlots&#xff0c;一行代码绘制science、nature、ieee等要求的图形。 安装 安装SciencePlots # 直接从PyPI安装 pip install SciencePlots 安装latex 如果latex未安装&#xff0c;会报错&#xff1a;RuntimeError: Failed to process st…

【QT开发】乒乓球碰撞反弹demo

在编写代码时&#xff0c;无意弄出来了一个这个东西&#xff0c;觉得挺有意思的记录一下&#xff0c;类似乒乓球在矩形内一直运动碰撞反弹demo 头文件 #ifndef MYPROJECT_H #define MYPROJECT_H#include <QMainWindow> #include <QPainter> #include "form.…

【区块链+基础设施】国家健康医疗大数据科创平台 | FISCO BCOS应用案例

在医疗领域&#xff0c;疾病数据合法合规共享是亟待解决的难题。一方面&#xff0c;当一家医院对患者实施治疗后&#xff0c;若患者转到其 他医院就医&#xff0c;该医院就无法判断诊疗手段是否有效。另一方面&#xff0c;医疗数据属于个人敏感数据&#xff0c;一旦被泄露或被恶…

前端开发中的常见问题及解决方法

前端开发是一个充满挑战和乐趣的领域。然而&#xff0c;在开发过程中&#xff0c;开发者常常会遇到各种各样的问题。本文将介绍一些前端开发中常用或者经常遇到的问题&#xff0c;并提供相应的解决方法&#xff0c;帮助你提高开发效率和解决问题的能力。 一. 页面布局问题 问题…

ArcTs布局入门03——层叠布局(Stack)

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01; 扫描下面的二维码关注公众号。 1、概述 叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实…

机械拆装-基于Unity-装配功能的实现

目录 1. 装配场景的相机控制 2. 鼠标拖拽和旋转功能的实现 2.1 鼠标拖拽 2.2 物体旋转 3. 零件与装配位置的对应关系 4. 轴向装配的准备位置 5. 装配顺序的实现 5.1 标签提示 5.2 定义一个变量记录步骤数值 1. 装配场景的相机控制 开始装配功能时&#xff0c;需要将相机调…

k8s公网集群安装(1.23.0)

网上搜到的公网搭建k8s都不太一致, 要么说的太复杂, 要么镜像无法下载, 所以写了一个简洁版,小白也能一次搭建成功 使用的都是centos7,k8s版本为1.23.0 使用二台机器搭建的, 三台也是一样的思路1.所有节点分别设置对应主机名 hostnamectl set-hostname master hostnamectl set…

QT4-QT5(6)-const char* QString 乱码转换

我简单粗暴的给出个结论&#xff1a; QString GBK编码正常&#xff0c;可以转UTF-8编码&#xff0c;但会有少量乱码。 const char* 编码就不要转编码&#xff0c;转哪个都是乱码。 UTF-8.cpp 下 1.QString GBK->UTF-8 2.const char * GBK->UTF-8 const char *…

ViewBinding的使用(因为kotlin-android-extensions插件的淘汰)

书籍&#xff1a; 《第一行代码 Android》第三版 开发环境&#xff1a; Android Studio Jellyfish | 2023.3.1 问题&#xff1a; 3.2.4在Activity中使用Toast章节中使用到了kotlin-android-extensions插件,但是该插件已经淘汰,根据网上了解,目前使用了新的技术VewBinding替…

Shiro框架

入门概述 1 shiro是什么? Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程…

Spring之spring的单例bean是线程安全的吗

Spring单例bean是线程安全的吗&#xff1f; 不是线程安全的。 1、Bean的作用域 Service Scope("singleton") public class UserServiceImpl implements UserService{ } singleton &#xff08;默认&#xff09;&#xff1a;bean在每个Spring IOC容器中只有一个实例…

【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫

二叉树1&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树2&#xff1a;深入理解数据结构第三弹——二叉树&#xff08;3&#xff09;——二叉树的基本结构与操作-CSDN博客 二叉树3&#xff1a;深入理解数据结构第三弹——二叉树…

BAS(入侵与攻击模拟)正在替代红队测试?

之前经常会被用户问到&#xff0c;漏扫、渗透和红队红的区别是啥&#xff1f; 传统的漏扫、渗透和红蓝对抗&#xff0c;可以看到工具化的漏洞不可靠&#xff0c;人工的成本就高。怎么找到一个漏洞可信度又高&#xff0c;成本又低的&#xff0c;就诞生了BAS。 抛开漏扫&#xf…

实体行业零基础做短视频矩阵,轻松实现海量曝光!

​在很多人的理解中&#xff0c;抖音是一个不错的盈利渠道&#xff0c;就像早些年的某宝、某多一样&#xff0c;我们现在在抖音看到的许多账号&#xff0c;大的IP&#xff0c;大多数都是品牌方、MCN机构&#xff0c;或者草根的网红等&#xff0c;但还是有不少实体老板没有入局&…

ShareSDK iOS端如何实现小红书分享

下载SDK 请登陆官网 &#xff0c;找到SDK下载&#xff0c;勾选需要的平台下载 导入SDK &#xff08;1&#xff09;离线导入将上述下载到的SDK&#xff0c;直接将整个SDK资源文件拖进项目里&#xff0c;如下图&#xff1a; 并且勾选以下3个选项 在点击Finish&#xff0c;…

Python - 递归函数(Recursive Function)的速度优化 (Python实现)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/140137432 免责声明&#xff1a;本文来源于个人知识与开源资料&#xff0c;仅用于学术交流&#xff0c;不包含任何商业技术&#xff0c;欢迎相互学…

RTSP协议在视频监控系统中的典型应用、以及视频监控设备的rtsp地址格式介绍

目录 一、协议概述 1、定义 2、提交者 3、位置 二、主要特点 1、实时性 2、可扩展性 3、控制功能 4、回放支持 5、网络适应性 三、RTSP的工作原理 1、会话准备 2、会话建立 3、媒体流控制 4、会话终止 5、媒体数据传输 四、协议功能 1、双向性 2、带外协议 …