LL(1)文法分析表的构造和分析过程示例
在考完编译原理之后才弄懂,悲哀啊。不过懂了就好,知识吗,不能局限于考试。
E→TE'
E'→+TE'|ε
T→FT '
T'→*FT'|ε
F→id| (E)
一、首先判断是不是 LL(1)文法
--------------------------------------------------------------------------------------------------------
文法G的任意两个具有相同左部的产生式 A --> α|β 满足下列条件:
1、如果α和β不能同时推导出ε,则 FIRST(α)∩FIRST(β) = 空
2、 α和β 至多有一个能推导出 ε
3、如果 β --*--> ε ,则 FIRST(α)∩ FOLLOW(A)= 空
--------------------------------------------------------------------------------------------------------
对于 E'→+TE'|ε ,显然ε --> ε, First(+TE') = {+} ,Follow(E') = {{),#} 显然二者交集为空满足。
对于 F→id|(E) ,First(id) = {id} First((E)) = {(} 显然二者交集为空满足。
所以该文法是LL(1)文法。
二、计算出First集和Follow集
参考:http://www.cnblogs.com/standby/p/6792774.html
三、构建LL(1)分析表
输入:文法G
输出:分析表M
步骤:
1、对G中任意一个产生式 A --> α 执行第2步和第3步
2、for 任意a ∈ First(α),将 A --> α 填入M[A,a]
3、if ε ∈ First(α) then 任意a ∈ Follow(A),将 A --> α 填入M[A,a]
if ε ∈ First(α) & # ∈Follow(A), then 将 A --> α 填入M[A,#] (觉得这步没用)
4、将所有没有定义的M[A,b] 标上出错标志 (留空也可以)
--------------------------------------------------------------------------------------------------------
过程就不赘述了,结果:

四、分析过程
步骤:
1、如果 X = a = # 则分析成功并停机
2、如果 X = a != # 则弹出栈顶符号X, 并将输入指针移到下一个符号上
3、如果 X != a,查询分析表M[X,a] , 如果 M[X,a] = {X --> UVW},
则用UVW (U在栈顶) 替换栈顶符号 X。如果 M[X,a] = error或空,
则分析器调用错误处理程序。
(只有在第2种条件下才将输入指针移动!!!)
根据上表,对输入串 “id + id * id” 进行预测分析过程如下:
最开始在栈里压入 # 和 开始符号 E

LL(1)文法分析表的构造和分析过程示例的更多相关文章
- FIRST集合、FOLLOW集合、SELECT集合以及预测分析表地构造
FIRST集合.FOLLOW集合.SELECT集合以及预测分析表地构造 FIRST集合的简单理解就是推导出的字符串的开头终结符的集合. FOLLOW集合简单的理解就对于非终结符后面接的第一个终结符. ...
- 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析
<编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...
- 编译原理根据项目集规范族构造LR(0)分析表
转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...
- 语法设计——基于LL(1)文法的预测分析表法
实验二.语法设计--基于LL(1)文法的预测分析表法 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 ...
- LR(0)文法项目集规范族、DFA和分析表的构建实例
最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践.结果一考试出问题了.... 学习就要脚踏实地,容不得半点模糊.凭着侥幸心理很危险的.以后要引以为戒啊. 特别写出这篇文章 :一来总结一下这 ...
- 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析
<编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...
- 编译原理LL1文法分析表算法实现
import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.tablenode.TableNode; import hjzgg ...
- Oracle表与索引的分析及索引重建
1.分析表与索引(analyze 不会重建索引) analyze table tablename compute statistics 等同于 analyze table tablename co ...
- MYSQL 分析表、检查表和优化表
1. 对表进行优化 ( 优化表主要作用是消除删除或者更新造成的空间浪费) 2. 对表进行分析(分析关键字的分布, 分析并存储MyISAM和BDB表中键的分布) 3. 对表进行检查(检查表的错误,并且为 ...
随机推荐
- vue-devtools 的安装和使用
vue-devtools的安装与使用 一.在github上下载压缩包,github下载地址:https://github.com/vuejs/vue-devtools 二.解压到本地的某盘 三.用你的 ...
- ecshop2.73修改密码方法|ecshop2.73修改密码方法
ecshop2.73修改密码方法|ecshop2.73修改密码方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2012-09-09 ecshop2.73正式版后 ...
- 日常工作中 Oracle12c参数的处理:
1. Oracle12c 修改过的参数 alter system set result_cache_mode=manual; alter system ; alter system set " ...
- Mordern Effective C++ --auto
5. 优先使用auto而非显示类型声明 在C++之中,使用auto关键字声明类型可以将程序员从输入繁琐的类型中解放出来,编译器会自动推导出变量的实际类型. template<typename I ...
- 无需破解:Windows Server 2008 R2 至少免费使用 900天
无需破解:Windows Server 2008 R2 至少免费使用 900天 2009年10月30日 星期五 02:10 1.首先安装后,有一个180天的试用期. 2.在180天试用期即将结束时,使 ...
- Java代码redis基础操作
maven依赖包: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- codeforces659B
Qualifying Contest CodeForces - 659B Very soon Berland will hold a School Team Programming Olympiad. ...
- C# == 和 Equals
先看一下解释 msdn对于 == 的解释: 对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false. 对于 string 以外的引用类型,如果两个操作数引 ...
- zxing生成二维码设置边框颜色
真是研究了很久很久,满满的泪啊 zxing生成二维码,默认是可以增加空白边框的,但是并没有可以设置边框颜色的属性. 其中增加空白边框的属性的一句话是: Map hints = new HashMap( ...
- 自学Linux Shell14.3-创建临时文件
点击返回 自学Linux命令行与Shell脚本之路 14.3-创建临时文件mktemp Linux系统保留了一个特殊的目录位置,以供临时文件使用.Linux使用/tmp目录处理不需要永久保存的文件. ...