(转载请表明出处  http://www.cnblogs.com/BlackWalnut/p/4472772.html

前面已经介绍过LL(1),以及如何使用LL(1)文法。但是LL(K)文法要求在看到K个字母的情况下必须做出预测,这相比于LR(K)文法而言就逊色很多。

  LR(K)文法的定义是:从左至右分析,最右推导,超前查看K个单词。先看一个例子,来对LR文法有个大致的印象。

  以上就是使用LR文法对源码进行分析的例子。注意到在LR文法中只有三个动作:移进,规约和接受,这三个动作也是通过查表来得到的。任何时候如果都是唯一确定这三个动作中的一个,我们就能让LR文法正确的运行。为了更好的理解LR(K)文法,我们先介绍以下最简单的LR(0)文法。

  因为动作是根据表来确定,所以,表的构建依然是我们构建的重点,先来看看一个表的最终形式:

  首先要说明的是,构建这张表的时候,我们使用到了状态机,行标就代表状态。列标由两部分组成,分别是终结符,和非终结符。s代表移进,r代表规约,g代表跳转,a代表接受,他们后面跟着的数字,除了r以外,都是状态的标号,只有r后面的数字指的时规约到第几个产生式。所有空的地方都代表出现错误。可见在非终结符下只有跳转。

  为了构建这个表,我们首先构建状态机。我们从一个基本的文法开始,文法如下:

  

  我们向产生式中添加一个点,形成这种形式,称为项。这个点的位置告诉我们当前在状态是什么。点每移动一次,我们跳转一个状态。点前面的字符串表示我们已经读取的历史,点后面的字符串表示我们希望得到的。也就是这种表达方式,既可以展望未来,也可以回顾过去。上面这个起始项中,我们希望得下一次得到一个S非终结符,可以看出1和2产生式是S的等价形式,如果我们得到1和2产生式的右部,我们就相当于得到了非终结符S,所以,我们的起始状态为:

  我们称第一个产生式为核心项,其他为普通项。这个状态我们称为状态1,所有的状态都是由这个状态中每个项的点的移动得到的。例如,状态1吃掉一个终结符x时,状态1的第二个项中的点要向右移动一位。得到状态2:

                                                                                       

  当然,状态1也可以吃掉一个终结符(,得到状态3:

                            

  状态3中的第一个项就是核心项。上面就我们说的移进操作。

  如果状态1吃掉的是一个非终结符S,那么我们称状态需要跳转,起始和移进时相似的效果。那么得到如下状态:

                            

  我们再来看状态2,目前点的位置已经到了产生式的最后面,那么意味着这个产生式已经完全匹配了,那么就可以将其规约。具体操作根据r的下标,选择产生式,将栈中的产生式的右部字符串全部弹出,将产生式的左部符号压栈,然后跳转到相应的状态。这个规约还是不太好理解,那么我们对最上面那张图的最后四个规约来举例解释一下。

  首先,要说明的是,在实际的使用过程中,在栈中的内容不包含任何的符号,只有状态编号,第一张图是为了方便大家理解,所以才将符号都放入栈中。那么,在规约弹出栈的时候,我们弹出的也都是状态编号。

  那么,对于最后四个规约的第一个规约,栈顶符号以此是  +16   (8  S12  ,18  E21  )22这六个符号以及六个个状态,只有最上面的四个满足规约,此时如果用项来表示的话,可以表示为E->(S,E).也就是说在 . 之前我们已经得到一个完整的产生式的右部,可以对其规约。需要把右部所涉及到的所有符号全部弹出,但是我们实际弹出的是状态,所以,原来的16 8 12 18 21 22 弹出状态后,得到的栈为16,我们弹出的字符串规约成为了非终结符E,此时,可以将E看作是在输入队列中输入端,得到  E

现代编译原理--第二章(语法分析之LR(1))的更多相关文章

  1. 现代编译原理——第二章:语法分析之LL(K)

    转自: http://www.cnblogs.com/BlackWalnut/p/4472122.html LL(K)语法分析技术是建立在预测分析的技术之上的.我们先来了解预测分析技术.考虑以下文法: ...

  2. Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析

    Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...

  3. 【编译原理】自底向上分析方法——LR文法分析方法的总结

    LR(0).SLR(1).LR(1).LALR(1) de 若干方面的区别 目录 推导过程 分析能力 本质区别 文法对比 可以适当利用物理意义对二义性文法进行冲突处理 推导过程 LR(0)的基础上才有 ...

  4. 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解

    语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...

  5. 编译原理根据项目集规范族构造LR(0)分析表

    转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...

  6. 编译原理LR(0)项目集规范族的构造详解

    转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...

  7. 第二章 Javac编译原理

    注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...

  8. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  9. 《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集

    <编译原理>-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集 上一篇:编译原理-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 本 ...

  10. 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法

    <编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...

随机推荐

  1. solr亿万级索引优化实践(四)

    本篇是这个系类的最后一篇,但优化方案不仅于此,需要后续的研究与学习,本篇主要从schema设计的角度来做一些实践. schema.xml 这个文件的作用是定义索引数据中的域的,包括域名称,域类型,域是 ...

  2. webpack(2)--Entry

    Entry entry是配置模块的入口,可以抽象成输入,webpack执行构建的第一步将从入口开始搜寻及递归解析出所有入口依赖的模块. 注意: entry是必填,若不填写则将导致webpack报错退出 ...

  3. django中使用Form组件

    内容: 1.Form组件介绍 2.Form组件常用字段 3.Form组件校验功能 4.Form组件内置正则校验 参考:https://www.cnblogs.com/liwenzhou/p/87478 ...

  4. QT按键(Qbutton)改变颜色

    第一种是按键上面的字颜色的改变:   ui->motor1->setStyleSheet("color: red"); 效果: 第二种是背景改变: ui->mot ...

  5. django-查询按时间排序

    Meta类实现 class News(models.Model): title = models.CharField(max_length=35) desc = models.CharField(ma ...

  6. springTask任务调度

    1什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的任务调度框架有Quartz和Sprin ...

  7. 浅谈RMI的特点及作用

    RMI:远程方法调用(Remote Method Invocation) 扩展:RPC与RMI的区别 1:方法调用方式不同: RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用.每个远 ...

  8. springBoot异常处理

    1.status=404 Whitelabel Error Page Whitelabel Error Page This application has no explicit mapping fo ...

  9. sqlserver还原数据库

    该方法只针对同等级数据库,不能跨级   比如sqlserver2012还原到sqlserver2008会报错 用数据库日志文件对数据库进行还原一 将日志文件.mdf文件和.ldf文件copy放置在sq ...

  10. python远程调试及celery调试

    部分来自 from: https://www.xncoding.com/2016/05/26/python/pycharm-remote.html 你是否经常要在Windows 7或MAC OS X上 ...