10

我目前正在学习编译器类,我很难理解使用 action/goto 表的 LR(1) 解析算法以及如何手动生成这些表。现在我们正在使用 Cooper 和 Torczon 的 Engineering a Compiler 作为我们的课堂教科书,我也阅读了关于表格生成的维基百科页面,但我仍然不理解这些概念。如果可能的话,任何人都可以推荐任何其他解释解析的书籍或在线资源吗?我认为许多大学都会有关于该主题的良好在线资源/幻灯片,但我不知道从哪里开始寻找。谢谢!

4

2 回答 2

9

由于算法细节,这些书总是难以阅读。除非您已经知道它们的含义,否则很难解释希腊符号和抽象操作。

我学习如何做到这一点的方法是编写一个小语法(简单表达式、赋值语句、if then 语句、语句序列),然后手动模拟算法。得到一张非常大的纸。仅使用目标符号和点 [ G = DOT RHS1 ... RHSM ] 绘制起始配置状态。然后处理未处理的状态,详细遵循算法;写下每个希腊符号在那个时刻代表什么。当您获得信心时,您会感觉更好,并且会更快。

基本上你要做的是,对于每个项目我

 [LHS RHS1 DOT RHS2 RHS3 ... RHSN] 

在一种状态下,将项目中的点推到右侧以生成新项目

 [LHS RHS1 RHS2 DOT RHS3 ... RHSN ]

在您的纸上绘制一个新状态 以该项目为种子的新状态,使用基于 FIRST(RHS3) 的前瞻集填写项目核心,扩展状态,然后重复。

第一次尝试时,这将花费您几个小时。每一秒都值得。用铅笔!

于 2011-03-04T22:52:39.573 回答
3

一些像样的讲义...

http://cs.oberlin.edu/~jdonalds/331/lecture14.html

理解和编写编译器有一节,LR(1) 分析的真正优势是什么?

http://www.amazon.com/Understanding-Writing-Compilers-Yourself-Macmillan/dp/0333217322

(也可在线免费获得)

这是一个不错的摘要的链接,尽管缺乏解释。

http://arantxa.ii.uam.es/~modonnel/Compilers/LR1Summary.pdf

更多讲义...

http://www.cs.umd.edu/class/spring2011/cmsc430/lectures/lec07.pdf

和这里的注释...

http://cobweb.ecn.purdue.edu/~smidkiff/ece495S/files/handouts/w3w4bBW.pdf

(包括 goto 和 action 表)

对不起,我不能亲自解释,我自己也不太确定。也许你会在身边找到一个善良、知识渊博的灵魂。

于 2011-03-04T20:24:50.373 回答