Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 帮助理解LR(1)解析器,表格生成?还有其他资源吗?_Parsing_Compiler Theory_Compiler Construction - Fatal编程技术网

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

Parsing 帮助理解LR(1)解析器,表格生成?还有其他资源吗?,parsing,compiler-theory,compiler-construction,Parsing,Compiler Theory,Compiler Construction,我目前正在学习一门编译器课程,我很难理解使用action/goto表的LR(1)解析算法以及如何手工生成这些表。现在我们正在使用库珀和托森的《工程编译器》作为我们的课堂教材,我也阅读了维基百科关于表生成的页面,但我仍然不理解这些概念。如果可能的话,有人能推荐其他解释解析的书或在线资源吗?我想很多大学都会有关于这个主题的好的在线资源/幻灯片,但我不知道从哪里开始寻找。谢谢 一些不错的课堂讲稿 理解和编写编译器有一节,LR(1)分析的真正优势是什么 (也可在网上免费获得) 这里是一个不错的摘要链

我目前正在学习一门编译器课程,我很难理解使用action/goto表的LR(1)解析算法以及如何手工生成这些表。现在我们正在使用库珀和托森的《工程编译器》作为我们的课堂教材,我也阅读了维基百科关于表生成的页面,但我仍然不理解这些概念。如果可能的话,有人能推荐其他解释解析的书或在线资源吗?我想很多大学都会有关于这个主题的好的在线资源/幻灯片,但我不知道从哪里开始寻找。谢谢

一些不错的课堂讲稿

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

(也可在网上免费获得)

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

更多课堂讲稿

还有这里的注释

(包括转到和操作表)


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

由于算法的细节,这些书总是很难读。希腊符号和抽象运算很难解释,除非你已经知道它们的意思

我学习的方法是写一个小小的语法(简单的表达, 赋值语句、if-then语句、语句序列),然后手工模拟算法。拿一张很大的纸。仅使用目标符号和点[G=点RHS1…RHSM]绘制开始配置状态。然后对未处理状态进行处理,详细遵循算法;写下每个希腊符号在那一刻所代表的含义。当你获得自信时,你会有一种更好的感觉,感觉会更快

基本上你要做的是,对于每一项

 [LHS RHS1 DOT RHS2 RHS3 ... RHSN] 
在状态下,将项目中的点向右推一处以生成新项目

 [LHS RHS1 RHS2 DOT RHS3 ... RHSN ]
在图纸上绘制一个新状态以该项目作为种子的新状态,使用基于第一个(RHS3)的前瞻集填充项目核心,展开状态,然后重复

第一次尝试时需要几个小时。值得每一秒。
用铅笔

+1。几年前,我和几个朋友在我们的办公室里参加了一个编译器课程。状态机填满了整个白板,所以我们必须在相邻的黑板上绘制动作/转到表。然后,我们已经没有足够的表面空间来记录算法的实际执行情况(正在执行的堆栈内容和操作),直到我们发现窗口是书写表面的极好来源!我们从绕道者那里得到了不少困惑的目光…:-)@Aasmund-Eldhuset:+1对于Windows的建设性使用:-}我应该已经看到了:p