最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践。结果一考试出问题了。。。。

学习就要脚踏实地,容不得半点模糊。凭着侥幸心理很危险的。以后要引以为戒啊。
特别写出这篇文章 :一来总结一下这几天的收获。二来与君共勉。


一、概念

1.概念解释

1、活前缀:不包含句柄右侧任一符号的规范句型的前缀称为该句型的活前缀。
                例如:Bab是下面那个文法的一个句型,其中b是句柄。
                那么针对这个句型的活前缀有:ε、B、Ba 和Bab
                (其实,LR分析器的工作过程实际上就是逐步产生规范句型的活前缀。
                 如果能构造出一个识别文法所有规范句型活前缀的确定有穷自动机即DFA,就能很方便的构造出LR分析表)
2、LR(0)项目:右部某位置上标有圆点的产生式称为相应文法的一个LR(0)项目
                 注意:A --> ε 只对应一个项目 A --> .
(LR(0)项目描述了活前缀和句柄的不同识别状态)
3、ε-可达:从 S' --> .S 出发,不必再识别任何符号就可以到达 S --> .BB,就称 S --> .BB是从
                S' --> .S 出发 ε-可达的。
4、项目集闭包:用Item0表示DFA的初始状态,对应分析的开始,并期待着逐步将输入符号串
                归约为开始符号S‘。因此将S' --> .S 放到 Item0 中,意即等待归约出S,且目前尚未
                得到S的任何符号。
                Item0 = CLOSURE({S' --> .S}) = {S' --> .S,S --> .BB,B --> .aB,B --> .b}
                该项目集合中所有的项目都是从S' --> .S 出发 ε-可达的,称为{S' --> .S}的项目集闭包
              (每个项目集闭包对应着分析器的一个状态)
5、后继项目:项目 A --> αX.β   称为 A --> α.Xβ  的后继项目
6、后继项目集:假定Item0是文法G的一个LR(0)项目集,
               则称 GO(Item0,X) = CLOSURE({A --> αX.β})  为 Item0 关于X的后继项目集。
               GO为项目集的转移函数。
7、项目集规范族:项目集的全体

2.例子

文法:
S --> BB
B --> aB
B --> b

二、实现步骤

1.扩展文法

S' --> S
S --> BB
B --> aB
B --> b

2.求出项目集规范族

Item0 = CLOSURE({S' --> .S}) = {S' --> .S,S --> .BB,B --> .aB,B --> .b}
Item1 =GO(Item0,S) = CLOSURE({S' --> S.}) = {S' --> S.}
Item2 = GO(Item0,B) = CLOSURE({S --> B.B}) = {S --> B.B,B --> .aB,B --> .b}
Item3 = GO(Item0,a) = CLOSURE({B --> a.B}) = {B --> a.B,B --> .aB,B --> .b}
Item4 = GO(Item0,b) = CLOSURE({B --> b.}) = {B --> b.}
至此Item0已经遍历完,开始遍历下一个,由于Item1圆点已经到达末尾,所以跳过Item1。
Item5 = GO({Item2,B) = CLOSURE({S --> BB.}) = {S --> BB.}
由于 GO(Item2,a) 和 GO(Item2,b) 重复,所以去掉。
Item6 = GO(Item3,B) = CLOSURE({B --> aB.}) = {B --> aB.}
由于 GO(Item3,a) 和 GO(Item3,b) 重复,所以去掉。
至此,项目集闭包不再增加,所以项目集规范族构造完毕!

3.构造DFA

方法很简单,看一下结果就懂了,在这里就不赘述了。
需要注意的是:要找到每个集合和其他集合所有的转移路径,容易遗漏!
 
 

4.构造LR(0)分析表(根据自己画出的DFA图,将分析表填充)

 
输入:文法G的扩展文法G'

输出:G'的LR(0)分析表(即 Action表和Goto表)

步骤:
1、本例中Item2  --B-->  Item5,则在  状态号为2的行,列名为B的格中填入状态5
(转移条件为非终结符,填充Goto表,填入状态号, 转移条件为终结符,填充Action表,
填入Sn,Sn表示移进,移进符号并且移进状态号n)
Item2  --a-->  Item3 ,则在状态号为2的行,列名为a的格填入S3。
2、对于圆点在右部最右边:
if  A --> α. ∈ Itemk (0<k<n)  & A --> α 为G的第 j 个产生式,
then for  任意 a ∈ T U {#}  do
Action[k,a]  =  Rj
(Rn表示归约,不移进符号,用第n个产生式的右部替换符号栈的X)
3、if  S' --> S.  ∈Itemk (0<k<n)    then Action[k,#] = acc.
 

LR(0)文法项目集规范族、DFA和分析表的构建实例的更多相关文章

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

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

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

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

  3. 求LR(0)文法的规范族集和ACTION表、GOTO表的构造算法

    原理 数据结构 // GO private static Map<Map<Integer,String>,Integer> GO = new HashMap<Map< ...

  4. vue-cli3.0 Typescript 项目集成环信WebIM 群组聊天

    项目背景 环信webim 官方没有vue版本的,自己就根据sdk重写了个vue版本的,只实现了基础的 登录 群组功能,其他的可以根据需要参考官方文档,添加相应的功能. 环信webim SDK相关文档: ...

  5. 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析

    <编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...

  6. LL(1),LR(0),SLR(1),LR(1),LALR(1)的 联系与区别

    一:LR(0),SLR(1),规范LR(1),LALR(1)的关系     首先LL(1)分析法是自上而下的分析法.LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法.       ...

  7. LL(1),LR(0),SLR(1),LALR(1),LR(1)对比与分析

    前言:考虑到这几种文法如果把具体内容讲下来肯定篇幅太长,而且繁多的符号对初学者肯定是极不友好的,而且我相信看这篇博客的人已经对这几个文法已经有所了解了,本篇博客的内容只是对 这几个文法做一下对比,加深 ...

  8. C# 语法分析器(二)LR(0) 语法分析

    系列导航 (一)语法分析介绍 (二)LR(0) 语法分析 (三)LALR 语法分析 (四)二义性文法 (五)错误恢复 (六)构造语法分析器 首先,需要介绍下 LALR 语法分析的基础:LR(0) 语法 ...

  9. LR(1)文法分析器 //c++ 实现

    1.先读入终结符,非终结符,和所有产生式. 2.预处理:初始化:getpp()获得每个非终结符在产生式左边时的产生式编号, 记录在 string getp[]中(可以多个). 3.获得所有的符号的fi ...

随机推荐

  1. mongoDB的配置和使用

    如何启动mongodb? mongod --dbpath C:\appStore\mongodata //数据库地址 再开一个cmder窗口 进入C:\Program Files\MongoDB\Se ...

  2. Centos7搭建LAMP+Typecho博客

    一.安装Apache的httpd服务 yum install httpd # 安装httpd服务 systemctl start httpd # 启动httpd服务 systemctl status ...

  3. 【Java】初始化

    默认域初始化 如果在构造器中没有显示地给域赋予初值,那么就会被自动赋予默认值:数值为0,布尔值为false,对象引用为null. 无参数构造器 很多类都包含一个无参数的构造函数,对象由无参数构造函数创 ...

  4. python中lambda表达式中自由变量的坑,因为for循环结束了 变量还保存着,详见关于for循环的随笔

    http://blog.csdn.net/u010949971/article/details/70045537

  5. Linux 4.21包含对AMD Rome处理器中新的Zen 2架构重要的新优化

    导读 Phoronix的Linux爱好者报告说,Linux 4.21里包含对AMD Rome处理器中新的Zen 2架构重要的新优化.AMD新推出的7nm EPYC Rome芯片带来了一种全新的独特架构 ...

  6. postgres(pgAdmin) 客户端保存密码

    pgAdmin 大象客户端保存密码后连接服务器,删除掉当前连接,建立一个新的连接不用输入密码也能连接上,其实是客户端保存了密码,让人误以为是空密码可登录.可以通过右键连接,选择重载服务配置,再次连接就 ...

  7. File操作

    对文件进行操作(只操作小文件) bool Exists(string path) 判断文件是否存在 FileStream Create(string path) 创建文件 void Move(stri ...

  8. docker --Dockerfile--一些语法

    环境更换 环境变量(与声明的ENV声明),也可以在特定指令作为变量用来被解释 Dockerfile.转义也被处理,从字面上包含类似于变量的语法. 环境变量Dockerfile用 $variable_n ...

  9. 【POI每日题解 #7】TES-Intelligence Test

    题目链接 这道题第一眼看去类比BANK-Cash Dispenser 不过1e6 * 1e6 = 1e12   分分钟MLE啊 想到优化 就yy到一种近似主席树的做法 来维护类似BANK的一堆序列 开 ...

  10. 自学Linux Shell2.1-进入shell命令行

    点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...