Standford Compiler Course Assignment 2

2023-10-24 23:05

本文主要是介绍Standford Compiler Course Assignment 2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二部分的作业是语法分析,通过编写cool.y(这个assignment的任务),利用bison将其自动生成语法分析LALR(1)的代码。

语法分析,就是将词法分析阶段已经识别好的token,按照语法的规则,构建抽象语法树的过程。

比如以下的代码:

x = (a + b) * (c - d);

可以构成下图的抽象语法树:

    =/ \x   */ \+   -/ \ / \a  b c  d

具体在cool.y 中,

在这里插入图片描述
这部分定义了非终结符non-terminal对应的semantic value. Union中的每一个field都可以是parsing动作的结果。

在stanford compiler的教学语言cool中,这就对应了AST的一个node。每一个non-terminal,都有其对应的semantic value。

左侧的各种类型在cool-tree.aps中都有对应定义,比如Features:

在这里插入图片描述

Feature即为class中的成员函数或者成员变量。因为可以有多个Feature,所以存在Features,即LIST[Feature].

下面则具体定义了所有的非终结符对应的AST节点类型。<>内部的,比如classes是在union中定义的value,而右侧的,比如class_list,我们需要定义规约该非终结符时,需要进行的操作。

在这里插入图片描述

在这里插入图片描述
上图中$$即为action的返回值,对应该抽象语法树AST对应的node。

具体看识别类的声明,class的规则:

1) CLASS TYPEID ‘{’ feature_list ‘}’ ‘;’
其动作:$$ = class_($2, idtable.add_string(“Object”), $4, stringtable.add_string(curr_filename))
对应cool-tree.aps中的:

在这里插入图片描述

传给class_的参数即为1)类名称,2)父类名称 3)成员变量/成员函数 4)文件名
起对应的位置如类名称即为 TYPEID,对应$2, feature_list对应$4,因此其动作action写成了如上图所示的样子。
2) CLASS TYPEID INHERITS TYPEID ‘{’ feature_list ‘}’ ‘;’
这里唯一不同的即为该类继承自父类,因此其第2个参数,父类名称传入了$4。具体的序号可以参考第205行的注释。

在这里插入图片描述

这篇关于Standford Compiler Course Assignment 2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278368

相关文章

2015多校联合训练第一场Assignment(hdu5289)三种解法

题目大意:给出一个数列,问其中存在多少连续子序列,子序列的最大值-最小值< k 这题有三种解法: 1:单调队列,时间复杂度O(n) 2:RMQ+二分,时间复杂度O(nlogn) 3:RMQ+贪心,时间复杂度O(nlogn) 一:RMQ+二分 RMQ维护最大值,最小值,枚举左端点i,二分找出最远的符合的右端点j,答案就是ans += j - i+1;(手推一下就知道) 比如1 2 3

【Power Compiler手册】9.时钟门控(4修改时钟门控结构)

修改时钟门控结构 在执行 RTL 时钟门控时,可以指定 `set_clock_gating_style -max_fanout` 命令来限制由单个时钟门控元素门控的寄存器数量。结果可能是具有相同使能信号的多个时钟门控元素,并且在逻辑上,具有相同的门控时钟信号。所有具有相同使能信号的时钟门控单元属于同一个时钟门控组。由单个时钟门控元素门控的所有寄存器属于同一个时钟门控子组。 由 `compi

standford nlp 教程

github https://github.com/stanfordnlp/CoreNLP 官网:http://stanfordnlp.github.io/CoreNLP/simple.html 功能:   SummaryAnnotator dependenciesTokenizationSentence SplittingLemmatization

纪念一下第二个assignment 100分

感悟就是:坚持,才能从good到great。精益求精就是要不断打磨产品。 Princeton的课就是好,一个作业可以牵扯到很多算法。复习了shuffle算法和Resevoir Sampling算法,还有linkedin,array implement deque,iterator的用法,确实不错的课程,经典就是经典!刷题不在乎刷题数目多少,而在于刷背后知识点的深度和广度。加油!我觉得我刷完A

纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment

今天终于完成了第一个Union-Find的assignment,之前觉得特别的难,可是最后自己也搞定了。而且是100%满分。 自己后来plot了一下自己的分数,也许这就是学习曲线吧。刚开始不会,到后来中期显著提高,但是要到100%,那就要经历更多的波折,甚至是下降都有可能。最后才能达到100%满分。 我觉得最有用的还是下面这段源代码: /*************************

Module compiled with Swift 版本号 cannot be imported by the Swift 版本号 compiler

今天把xcode升级到12.5最新版,然后编译出现下面错误。。。记录下 XCTestWD:Module compiled with Swift 5.3.1 cannot be imported by the Swift 5.4.2 compiler: /Users/liyinchi/TestTool/node-v12.18.3-darwin-x64/lib/node_modules/app-in

【Python】UnboundLocalError: local variable 'x' referenced before assignment

内部函数,不修改全局变量可以访问全局变量内部函数,修改同名全局变量,则python会认为它是一个局部变量在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError  1、单独访问全局变量    2、修改全局变量    3、如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有

hdu5289 Assignment --2015多校训练赛(一)

题意: 给定一串数字,里面存在多少个区间[l, r] 使得里面的最大值与最小值之差小于k。 思路: 用RMQ预处理出所有区间的最大值与最小值之差。之后枚举左端点L, 二分处理差值小于k的最左边端点R,把所有 的R-L+1加上就是答案。 /************************************************ Author: fisty* Create

Java compiler level does not match the version of the installed Java project facet. map解决方法

右键项目“Properties”,在弹出的“Properties”窗口左侧,单击“Project Facets”,打开“Project Facets”页面。 在页面中的“Java”下拉列表中,选择相应版本就OK了。

解决: g++: internal compiler error: Killed (program cc1plus)

查了很多资料,最后发现主要原因是内存不足,g++编译时需要大量内存, 临时使用交换分区来解决吧 虚拟机直接调整内存大小,远程服务器可使用以下命令 命令行输入:sudo dd if=/dev/zero of=/swapfile bs=64M count=16sudo mkswap /swapfilesudo swapon /swapfile编辑完成后,退还空间:sudo swapoff /sw