语法分析设计文档

LR分析法分LR(0),SLR(1),LALR,LR(1)好几种,具体是SLR(1)分析法,对于LR分析法来说,语法分析过程都由一个称为“总控程序”来完成的

总控程序是LR分析法的核心处理模块,而LR分析表又是总控程序的核心部分,所以整个LR分析法的核心部分就是求出LR分析表,下面就首先说明LR分析表的构造

给定文法(注意这里的标号表示的是第几条归约式,后面会用到!):

 1.  E -> E+T2.  E -> E-T3.   E -> T4. T -> T*F 5.  T -> T/F 6.  T -> F7. F -> (E) 8.  F -> i

文法的项目集:

 E’ -> E          (注意这个E’,其实目的就是说推导从这里开始)E -> E+TE -> E-TE -> TT -> T*F T -> T/F T -> FF -> (E) F -> i

项目集规范族(这个跟书本上的是一样的,最好是自己先推一下):

 I0:E’ -> .E           I1(下一步接收E)E -> .E+T       I1E -> .E-T      I1E -> .T            I2(下一步接收T)T -> .T*F        I2T -> .T/F      I2T -> .F            I3(下一步接收F)F -> .(E)        I4(下一步接收左括号)F -> .i            I5(下一步接收i)I1:E’ -> E.E -> E.+T      I6(下一步接收+)E -> E.-T       I7(下一步接收-)I2:E -> T.T -> T.*F        I8(下一步接收*)T -> T./F        I9(下一步接收/)I3:T -> F.            I4:F -> (.E)      I10(下一步接收E)E -> .E+T      I10E -> .E-T     I10E -> .T           I2(这个状态以前出现过)T -> .T*F         I2T -> .T/F      I2T -> .F            I3F -> .(E)      I4F -> .i            I5I5:F -> i.I6:E -> E+.T       I11(下一步接收T)T -> .T*F       I11T -> .T/F         I11T -> .F           I3F -> .(E)      I3F -> .i            I5I7:E -> E-.T        I12(下一步接收T)T -> .T*F       I12T -> .T/F         I12T -> .F           I3F -> .(E)      I4F -> .i            I5I8:T -> T*.F        I13(下一步接收F)F -> .(E)       I4F -> .i            I5I9:T -> T/.F        I14(下一步接收F)F -> .(E)       I4F -> .i            I5I10:F -> (E.)       I15(下一步接收右括号)E -> E.+T        I6E -> E.-T      I7I11:E -> E+T.      T -> T.*F        I8T -> T./F      I9I12:E -> E-T.T -> T.*F       I8T -> T./F      I9I13:T -> T*F .I14:T -> T/F .I15:F -> (E) .

这个推导过程应该没问题吧?如果有问题,仔细再检查一下!好,这个推导过程其实对于LR(0),SLR(1),LALR,LR(1)都是必经的一步,而且都是一样的,真正不一样的地方就体现在最终的分析表上

问题:这个文法是LR(0)文法吗?如果不是,那么它是SLR(1)文法吗?(请务必先自己认真思考一下,再看解答,因为这个问题很关键!)

解答:

从上述的项目集规范族观察I2,I11,I12:

 I2:E -> T.T -> T.*F        I8(下一步接收*)T -> T./F        I9(下一步接收/)I11:E -> E+T.        T -> T.*F        I8T -> T./F      I9I12:E -> E-T.T -> T.*F       I8T -> T./F      I9

注意到没有?对于I2,从I2状态出发,接收了T后,可以到达I8和I9状态,那么到底应该前往哪一个状态呢?

于是这个文法不是LR(0)文法!(I11和I12的分析同理)

要证明是不是SLR(1)文法,先求Follow集

Follow(E) = {+,-,),#}(# 是终结符)

因为E -> E+T

所以Follow(E)是Follow(T)的子集(就是E有的T里也要有)

Follow(T) = {+,-,),*,/,#}(# 是终结符)

因为T -> T*F

所以Follow(T)是Follow(F)的子集

Follow(F) = {+,-,),*,/,#}(# 是终结符)

好了,现在可以构造SLR(1)分析表了,先给出这个表

回顾项目集规范族,一步步填表:

1. 从I0出发,接收E到达I1,于是在状态栏0列,GOTO表E列填入1;接收T到达I2,同理填入2;接收F到达I3,同理填入3;接收左括号到达I4,在ACTION表(列填入S4;接收i到达I5,在ACTION表i列填入S5

2. 从I1出发,因为这里第一条“E’-> E.”意味着文法被接受(Accept),所以(1,#)填入ACC,表示到达此状态文法被接受,对应的(1,+)填入S6,(1,-)填入S7

3. 从I2出发,因为这个状态会导致冲突,因此要使用SLR(1)分析法消除冲突

对于“E -> T.”,还记得Follow(E)吧,现在就在(2,#)和(2,Follow(E))的所有元素,即(2,+),(2,-),(2,))上填入R3(R3表示将其归约为第三条归约式,还记得前面的标号吧)

对于:

T -> T.*F       I8(下一步接收*)

T -> T./F       I9(下一步接收/)

直接在(2,*)上填入S8,(2,/)上填入S9

我想到这里,你应该自己推出整个表了吧!不信?自己推一次!上述有错漏之处,望指正!

既然有了分析表,现在就要使用总控程序对输入串进行语法分析了,分析表中有Si和rj大家都知道的。S是shift的缩写,也就是移进,R是reduce的缩写,也就是规约。规约是推导的逆操作。

先来看看在进行分析的时候S和R操作的规则

Si:移进,把i移入到状态栈,把a移入到符号栈。其中i,j表示状态号。
Ri:归约,用第i个产生式归约,同时状态栈与符号栈退出相应个符号,并把GOTO表相应状态和第i个产生式的左部非终结符入栈。

分析输入串“((i+i))”进行语法分析(我手写的分析过程和LemonParser的一样,直接上图吧)

第一步,符号栈中是#,输入符号串就是给定的要分析的串,状态栈因为从0开始,所以状态栈直接填0,应该知道,LR分析是从左到右扫描的。所以心里想着一根指针p,p首先指向输入串的‘(’,然后我们查ACTION表的(0,‘(’),0就是状态0,‘(’就是指针的当前字符。分析表中的(0,‘(’)是S4,填入第一步的ACTION,并且动作列填入移进,根据规则,将4入状态栈,‘(’入符号栈
    进入第二步,指针p肯定要前进一步了,所以输入符号串就进入b了,此步同上一步,不多解释
    关键是进入第四步后,此时,符号栈中为#((i,输入符号串是+i))#,状态栈是0445,此时去查ACTION表,查得(5,+),5是状态栈顶,+是p指针的当前位置。发现是R8,根据规则,用第8条产生式F -> i来规约。把动作栏GOTO先填了,同时状态栈与符号栈退出相应个符号,也即是说,把状态栏的栈顶5退出来,同时符号栈的i也退出,心里想着,不填表,并把GOTO表相应状态和第8个产生式的左部非终结符F入栈。GOTO表需要查的是(4,F)=3,8是R8的8,F是第8个产生式的左部。所以,就把3入状态栈,F入符号栈
  
    后面的都是一样的,不解释了,想明白这个过程,多动手是必需的,你也手工试试吧

SLR(1)的语法分析器:

一个语法分析器的实现相关推荐

  1. 《编译原理》实验报告——基于YACC的TINY语法分析器的构建

    一.实验要求 运用YACC,针对TINY语言,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验方案 (1)设计基于LEX的TINY词法分析器 (2)设计基于YACC的TINY语法分析器 ( ...

  2. 《编译原理》实验预习报告——基于YACC的TINY语法分析器的构建

    一.实验目的 运用YACC,针对给定的文法,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验预习提示 1.表达:针对5.5节中的calculator文法,设计输入和输出 2.观察:观察pa ...

  3. 编译原理——实验叁——基于YACC的TINY语法分析器的构建

    一. 实验要求 运用YACC,针对TINY语言,构造一个语法分析器.给出实验方案,实施并描述结果. 二. 实验方案 (1)设计基于YACC的TINY词法分析器 (2)设计基于LEX的TINY语法分析器 ...

  4. 编译原理——实验叁预习报告——基于YACC的TINY语法分析器的构建

    一.实验目的: 运用YACC,针对给定的文法,构造一个语法分析器.给出实验方案,实施并描述结果. 二.实验预习提示 1.表达:针对5.5节中的calculator文法,设计输入和输出 2.观察:观察p ...

  5. Vczh Library++ 语法分析器开发指南

    Vczh Library++ 语法分析器开发指南 陈梓瀚 前言 在日常的开发工作中我们总是时不时需要写一些语法分析器.语法分析器不一定指的是一门语言的编译器前端,也有可能仅仅是一个自己设计格式的配置文 ...

  6. 自制编译器:语法分析器(一)

    感觉语法分析器在编译器前端是一个较为庞大的东西,因此打算分两篇博客来描述,第一篇着重描述思想,第二篇具体论述实现. 1.语法分析器要做什么 在编写任何一个东西的的时候,都要先弄明白这个玩意儿是做什么的 ...

  7. ANTLR4 初识语法分析器生成工具 ANTLR

    Antlr 版本:4.9.3 1. Antlr 简介 Antlr 是一款强大的语法分析器生成工具,可用于读取.处理.执行以及翻译结构化的文本或二进制文件.被广泛应用于学术领域和工业生产实践,是众多语言 ...

  8. 自制编译器:语法分析器(二)

    这篇博文拖了好久才写完,其一是语法分析器本身的难度实在有点超出我的预料,以至于反复重构多次才完成,其二是因为弄了个xbox玩,占用了一部分的课余时间= =!. 本篇博文将分为以下几个部分来描述一下语法 ...

  9. 编译原理实验五:用Yacc设计语法分析器1

    所有实验的源代码:点此下载 实验目的: 学习如何使用Yacc设计一个语法分析器,并与用lex写的词法分析器链接起来. 实验内容: 使用yacc为实验2所给的语言写一个语法分析器(你可以重新设计该语言的 ...

最新文章

  1. 为centos选择国内yum软件库
  2. 浅谈CMMI几个过程概念流程管理 (转)
  3. mac安装软件管理Android手机,Mac如何管理Android手机:这方式很得体
  4. 14_面向对象API绘图、图中图 (A Plot inside of Another Plot)、设定绘图范围Setting the Plot Range、对数尺度Logarithmic Scale
  5. Freemarker自定义标签
  6. XML Tree(树形结构)
  7. 如何用ant给Java项目生成文档
  8. Team Foundation Server简介
  9. python如何导入numpy简书_如何使用python3.x成功导入numpy?
  10. docker 镜像 增删改查
  11. 线上BUG 处理并分析原因
  12. 二维光子晶体带隙仿真Matlab完全程序_平面波展开法
  13. C++里面的LPBYTE是什么意思
  14. 简单方法去除图片水印图文教程
  15. 决战行测5000题-数量关系精华版
  16. 一款简单而强大的截图软件 Snipaste
  17. MapWindow GIS二次开发
  18. Excel解析easyexcel工具类
  19. MOOC编程题#2: 魔兽世界之二:装备
  20. MATLAB数据类型——浮点数

热门文章

  1. PHP工厂模式的好处
  2. 关于EOF和读文件的一些事
  3. 网络协议之:基于 UDP 的高速数据传输协议 UDT
  4. 浅浅的介绍一下STL
  5. 什么是算法?数据结构与算法概念
  6. 有道笔记链接地址 -----关于python
  7. 存储模型之虚拟存储技术
  8. 盘点Linux操作系统的十大版本
  9. 什么是数字证书、公钥私钥
  10. 优思学院|六西格玛的真理