第二部分的作业是语法分析,通过编写cool.y(这个assignment的任务),利用bison将其自动生成语法分析lalr(1)的代码。
语法分析,就是将词法分析阶段已经识别好的token,按照语法的规则,构建抽象语法树的过程。
比如以下的代码:
x = (a + b) * (c - d);
可以构成下图的抽象语法树:
= / x * / + - / / a b c d
具体在cool.y 中,
这部分定义了非终结符non-terminal对应的semanticvalue. union中的每一个field都可以是parsing动作的结果。
在stanfordcompiler的教学语言cool中,这就对应了ast的一个node。每一个non-terminal,都有其对应的semanticvalue。
左侧的各种类型在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 '}' ';'{ /* 对应动作 action*/ $$ = class_($2, idtable.add_string(object), $4, stringtable.add_string(curr_filename));}
其动作 对应cool-tree.aps中生命的constructor,
传给class_的参数即为
1)类名称 2)父类名称 3)成员变量/成员函数
4)文件名
对应的位置如类名称即为typeid,对应$2, feature_list对应$4,因此其动作action写成了如上图所示的样子。
cool语法中,如果class类没有继承自其他类,那么默认继承自object类型,因此parent设置为object。
2)
class typeid inherits typeid '{' feature_list '}' ';'{ $$ = class_($2,$4,$6, stringtable.add_string(curr_filename)); }
这里唯一不同的即为该类继承自父类,因此其第2个参数,父类名称传入了$4。具体的序号可以参考第205行的注释。
人工智能和机器学习增强日常生活
华为取消机器视觉军团 AIOT市场竞争太卷
oppor11什么时候上市?oppor11真机照曝光:前后2000万双摄,外观惊艳群芳
被动锁模原理和前沿超快激光器介绍
怎样给VCD机加装遥控开关机电路
Stanford编译原理详解
推广无人驾驶汽车的同时 相关部门也在完善无人驾驶汽车的相关法律规范
最简单直流电机调速 如何增加直流电机的转速
充电桩云平台在城镇物业小区改造中的应用
联发科与中国联通、电信完成5G独立组网实网测试
宁波交通的快速发展得益于什么
销量惨淡,iPhone 13大降价!
java之父及java诞生_java之父为什么从谷歌离职
今年二季度国内5G智能手机市场将恢复增长势头
OPPOR7s拆解 做工及用料如何
元宇宙如何影响物理世界
雷蛇新版Blade游戏本上线:7代Kaby Lake处理器+4K多点触控屏 售价1900美元起
使用标准Arduino Nano起点快速制作原型
基于模型的镜头边界检测算法的研究分析
使用移位寄存器构建环形计数器电路