帮助理解LR(1)解析器,表生成?还有其他资源吗?

时间:2011-03-04 20:23:12

标签: parsing compiler-theory compiler-construction

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

2 个答案:

答案 0 :(得分:9)

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

我学会了如何做到这一点,就是写一个小小的语法(简单的表达, 赋值语句,如果then语句,语句序列),然后手模拟算法。得到一张非常大的纸。仅使用目标符号和点[G = DOT RHS1 ... RHSM]绘制起始配置状态。然后按照算法详细处理未处理的状态;写下当时每个希腊符号代表的内容。当你获得自信时,你会感觉更好,而且会更快。

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

 [LHS RHS1 DOT RHS2 RHS3 ... RHSN] 

在某个州,将第一项中的点向右推,以生成新项目

 [LHS RHS1 RHS2 DOT RHS3 ... RHSN ]

在您的纸张新状态上绘制一个新状态,将该项目作为种子,使用基于FIRST(RHS3)的前瞻设置填充项目核心,展开状态,然后重复。

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

答案 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

(包括转到和行动表)

抱歉,我个人无法解释,我不太确定自己。也许你会找到一个善良,知识渊博的灵魂。