我目前正在编写一个编译器类,我很难理解使用action / goto表的LR(1)解析算法,以及如何手动生成这些表。现在我们正在使用Cooper和Torczon的Engineering a Compiler作为我们的课本,我还阅读了关于桌子生成的维基百科页面,但我仍然不理解这些概念。如果可能的话,任何人都可以推荐任何其他解释好解析或在线资源的书吗?我认为很多大学都会有很好的在线资源/幻灯片,但我不知道从哪里开始寻找。谢谢!
答案 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
(包括转到和行动表)
抱歉,我个人无法解释,我不太确定自己。也许你会找到一个善良,知识渊博的灵魂。