编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上)
自顶向下
- 递归下降分析法
这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用。
- LL(1)分析法
又称预测分析法,是一种不带回溯的非递归自顶向下分析方法。(使用显式栈)
LL(1)的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将使用最左推导,1表明只需向右看一个符号便可决定如何推导,即选择哪个产生式(规则)进行推导。
需要解决的几个问题
1.怎么根据某个文法构造LL(1)分析表
First集
【注:first集需要注意的是----产生式右部是以非终结符开始 而且这个非终结符会推出ε,那么first集就得加入下一个的first集】
Follow集
【注:follow集需要注意的是----这种类型的产生式A->αBβ且β->ε的形式 与A->αB同样看待】
2.怎么判断一个上下文无关文法是不是LL(1)文法
自底向上
- 算符优先分析法(OPG)
它只考虑算符(终结符)之间的优先关系,分析扫描每个规约式的算符间优先关系。算符文法:即它的任一产生式的右部都不含两个相继的非终结符的文法。如果G是一个不含空字符的算法文法,那么只要它的任一对终结符都至多只满足>,=,<的关系的其中一种,则称g是一个算符优先文法。
假定G是一个不含空字符产生式的算符文法。对于任何一对终结符a,b,
(1)a=b,当且仅当G中含有形如P->…ab…或P->…aQb…的产生式;
(2)a<b, 当且仅当G中含有形如P->…aR…的产生式,而R-〉b…或R->Qb…;(3)a>b, 当且仅当G中含有形如P->…Rb…的产生式,而R->…a或R->…aQ;【注:a<b不等价于b>a! 这里的等号左右顺序指明的是式子中这两个终结符的左右顺序。
实际上,这里的大小关系就是先后规约的优先级关系】
需要解决的几个问题
- 构造Firstvt以及Lastvt集
- 接着便是构造优先关系表
给几个语法分析的例题
再看一个例子,判断某个上下文无关文法是否是LL(1)分析文法(或者将某个文法改造成LL(1)分析文法[其实,是先将这个文法消除左递归、回溯,这是LL(1)分析文法的基本条件,再应用充要条件判断是否是LL(1)分析文法])
算符优先分析法的例子
再看看下面这个例子(经过这些例题的理解,其实就是这两种语法分析就是在于 first/follow集 以及 firstvt/lastvt集的运算 再加上一点各自方法)
编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解的更多相关文章
- 【学习笔记】薛定谔的喵咪Cat—球盒问题(全详解)
[学习笔记]薛定谔的喵咪Cat-球盒问题(全详解) [题目描述] 当一个猫在盒子里时,因为放射物的状态我们不知道,所以猫的状态我们也不知道,这就所谓猫的生死纠缠态,也是所谓的薛定谔的猫. 当我们做需要 ...
- Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析
Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
- VSTO学习笔记(七)基于WPF的Excel分析、转换小程序
原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...
- 并发编程学习笔记(8)----ThreadLocal的使用及源码分析
1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...
- iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...
- Unity3D 骨骼动画原理学习笔记
最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...
- Java并发之底层实现原理学习笔记
本篇博文将介绍java并发底层的实现原理,我们知道java实现的并发操作最后肯定是由我们的CPU完成的,中间经历了将java源码编译成.class文件,然后进行加载,然后虚拟机执行引擎进行执行,解释为 ...
- UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信
1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...
随机推荐
- WPF调用摄像头
添加程序集:WPFMediaKit.dll 更关键代码如下: 界面设计代码如下: <Window x:Class="摄像头调用.MainWindow" xmlns=" ...
- 对于进程没杀死占用内存和cpu行为的方法
在跑机器学习或者深度学习的过程中有可能遇到没杀死进程的情况,但是程序的入口又没关掉,尤其是我使用jupyter从远程Linux映射到windows浏览器跑程序的时候 对于上面的问题, 首先运行 hto ...
- .NET Core Linux 部署实践
部署环境:CentOS 7 x64 必要条件:当前用户有sudo权限 1. 安装依赖包sudo yum install libunwind libicu2. 下载.net core安装文件curl - ...
- Windows 下开发.NET Core应用
一.使用Visual Studio 2015开发1.1 依次安装Visual Studio 2015 Update 3.NET Core 1.0.0 - VS 2015 Tooling Preview ...
- NOIP2017年11月9日赛前模拟
最后一次NOIP模拟了····· 题目1:回文数字 Tom 最近在研究回文数字. 假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:
- python使用openpyxl操作excel
def initExcel(): file_path = "test.xlsx" file = load_workbook(file_path) table = file[&quo ...
- Topcoder SRM 601 div1题解
日常TC计划- Easy(250pts): 题目大意:有n个篮子,每个篮子有若干个苹果和橘子,先任取一个正整数x,然后从每个篮子中选出x个水果,把nx个水果放在一起,输出一共有多少种不同的组成方案.其 ...
- Java并发编程--AQS
概述 抽象队列同步器(AbstractQueuedSynchronizer,简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量(命名为state)来维护同步状态, ...
- Handler 源码分析
Handler用法: 无参 Handler 构造函数实例化一个 Handler 类型的全局变量,并重写其 handleMessage 方法,在某一方法内调用 Handler 的 sendEmptyMe ...
- 关于math头文件
math.h是c语言里的 cmath是c++里的 fabs是对小数求绝对值 abs是对整数绝对值 用math.h里的abs对小数不能求绝对值- - fabs对小数取绝对值 abs是对整数 现在要对一个 ...