编译技术图式(第四章 语法分析)03自下而上的语法分析

模型类型笔记

1、引入


 有向:从左到右

手动模式:

  • 最右推导的逆过程
  • 将点后单个字符移入工作区
  • 点在加点表达式移动的过程

补充知识:

  • 加状态栈的目的:分析时不用重启自动机
  • 句柄是工作区最右侧的某几个符号(点所在表达式的点左侧)
  • =》*,=》+任意步数
  • LR(0)不一定是最左规约,但一定是最右推导逆过程
  • LR(0)文法的生成表s,r在一个格里成为移进冲突,不能允许,求follow集除去r
  • LR(0)文法文法改造
    • 加一个接受项目S->E的文法改造(拓广文法),如有就无改造
    • 对左递归和公共左因子无所谓,无需改造

2、LR(0)文法


 

(1)构建(确定)有限自动机

1)求有限自动机

 

 

  • 构成每个新框图的产生式
    • 识别的原串(带点)
    • 点后非终结符的相关产生式(点在箭头后)
  • 每个框图间由箭头连接,识别单字符后进入新框图
  • 同类框图不需要再建立

2)分析

  • 读入字符,对应的自动机标号也压入堆,进入下一个框图
  • 自动机到头,则句柄被识别弹出,弹出字符数由句柄长度决定,对应规约的非终结符压入堆;同时对应的自动机框图的标号弹出和压入
  • 最后成功则为S,框图标号为0

3)为了让计算机识别,用LR(0)分析方法表示

自动机转为表格表示(自动机內部产生式信息丢失)

  • action表
  • goto表
  • acc:遇到#号完结
  • S:shift,因T、E等非终结符是因为规约,不写shift
  • r:Redue规约
  • r后数字是产生式序号

3)改进:LR(0)—> SLR(1)

0指的是规约不向后看,1指往后看一个

E的fellow集,第四行除了fellow集中的“)”和“#”的r2都去掉(因为E后只能接)和#,否则都错误)

4)LR分析总结

 3、文法相关概念


 

  1. 短语
    • 通过树理解短语
      • 句型:推导树的叶节点自左至右连接
      • 短语:子树的边缘时相对于根的短语(根是相对的)
      • 直接短语:有且仅有两层的子树的短语
      • 句柄:最左的有且仅有两层的子树边缘(根是绝对的)
    • 短语定义:
  2. 规范句型:由规范(最右)推导推出的句型
    • 栈中符号与未分析的串连在一起,可由最右推导得出

  3. 活前缀:栈中符号为“规范句型”的前缀(从最左开始),且该前缀绝不含有句柄右边的符号(可能不包含/包含部分/不包含句柄)
  4. 项目
    • 项目:在产生式右部添加一个圆点(原带点表达式)
    • 活前缀与项目的关系:项目的有效性

      •  
  5. 有效项目集:对活前缀δα有效的项目的集合(原框图)
  6. LR(0)项目集规范族: 文法G所有“有效项目集” 的集合(原自动机)

  7. 项目集上的闭包运算:closure(I)(即不写自动机,换一种写法)
    • 文法改造:拓广文法(如有S->,则不进行改造)
    • 然后构造action表和goto表
    • 两种冲突:规约/规约冲突,移进/规约冲突,用SLR(1)文法
    • 分析能力, LR(1)最强, LALR(1)次之, SLR(1)再次,LR(0)最弱

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-10-29 16:44  日月同诲  阅读(405)  评论(0编辑  收藏  举报