编译原理

<<编译原理>> 

阅读如下书籍

  <<编译原理>> 

  第二版

  何炎祥 主编

  华中科技大学出版社

此书300多页, 比较剪短, 适合快速阅览, 不足的是有一些排版错误

再次翻阅此书, 第7章是精华,  看懂第7章, 这本书就能了然于胸

重点学习: 向前LR(LALR)分析表构造法

LR(0)

活前缀

  规范句型的一个前缀, 它不包含该句型的句柄右边的任何符号。

  之所以称为活前缀, 是因为它右边添加一些终结符之后总可以构成一个规范句型。

拓广文法G'

  S' -> .S

项目概念

  A -> xy 的项目是 A -> .xy  A -> x.y  A -> xy.

  A -> 空 的醒目是  A -> .

  直观的说, 项目是分析的某一时刻, 已经看到了产生式多少。

CLOSURE(I)函数

  如果I是的任一项目集, 那么I的闭包CLOSURE(I)规则如下

  1: I 属于CLOSURE(I)

  2: 若 A -> a . Bb 属于CLOSURE(I), 且B -> r 是文法产生式, 则任何B -> .r也应加入到CLOSURE(I)

  3: 重复, 直至不在增大

goto(I, X) 函数

  求接受X后的CLOSURE(I)

  如果I是某个活前缀r的有效项目, 则goto(I,X)是对活前缀rX有效的项目集

项目集规范族

  起始是一个集合, 只有一个元素, CLOSURE(S' -> S)

  后面一直计算goto, 直到点都到了最右

项目集的DFA

  将每个项目集族看成一个状态, 那么, goto函数就可以看作一个DFA

构造LR(0)分析表的步骤小结

  1. 写拓广文法G'

  2. 写出G'的基本LR(0)项目

  3. 利用CLOSURE 和goto, 求出项目集规范族C

  4. 构造识别该文法全部活前缀的DFA

  5. 根据算法构造LR(0)分析表

LR(0), SLR, LALR, LR(1)比较

构造LALR分析表通用算法

  1. 构造LR(1)项目集族

  2. 如果不存在冲突动作, 就合并同心项目

  3. 如果合并后, 不存在规约规约冲突, 则按照合并后的集族构造分析表

LR 文法是无二义的。

冲突解决

  移进-规约冲突

    if else利用这个规则, 移进优于规约

  规约-规约冲突

    设定优先级, 前面的产生式优先级高

  结合特性

  

原文地址:https://www.cnblogs.com/lpthread/p/5113809.html