10

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

回答

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和操作表)

对不起,我不能亲自解释,我不太确定我自己。也许你会发现一个善良,更有知识的灵魂。

9

由于算法的细节,书籍总是很难阅读。除非你已经知道他们的意思,否则希腊符号和抽象操作很难解释。

我学会了如何做到这一点的方式,是写一个小小的语法(简单的表达, 赋值语句,如果再声明,声明的顺序),然​​后手模拟算法。得到一张非常大的纸。用目标符号和点[G = DOT RHS1 ... RHSM]绘制起始配置状态。然后按照算法详细处理未处理的状态;写下每个希腊符号代表的那一刻。随着你获得自信,你会有更好的感觉,并且会更快。

本质上你所要做的是,对每个项目我

[LHS RHS1 DOT RHS2 RHS3 ... RHSN] 
的状态

,一个地方推点在项目的权利,产生一个新的项目

[LHS RHS1 RHS2 DOT RHS3 ... RHSN ] 

平局在你的纸上新状态以该物品为种子的新状态,用基于FIRST(RHS3)的前瞻集填充物品核心,展开状态并重复。

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

+5

+1。我和几个朋友在我们的办公室做了这个,几年前我们编了一门编译器课程。状态机填满了整个白板,所以我们不得不在邻近的黑板上绘制动作/转到桌子。然后,我们没有足够的表面空间来记录算法的实际执行情况(堆栈内容和正在执行的操作) - 直到我们发现_windows_是写表面的绝佳来源!我们从绕行者那里得到了不少困惑的样子...... :-) – 2011-03-06 17:03:30

+1

@Aasmund Eldhuset:对建设性使用Windows的+1: - } – 2011-03-06 18:09:02

+0

我应该看到一个来临:p – 2011-03-06 21:16:22