企业门户网站源码,群晖wordpress安装教程,温州易富信息技术有限公司,成都网站建设开发公第二部分的作业是语法分析#xff0c;通过编写cool.y(这个assignment的任务)#xff0c;利用bison将其自动生成语法分析LALR(1)的代码。
语法分析#xff0c;就是将词法分析阶段已经识别好的token#xff0c;按照语法的规则#xff0c;构建抽象语法树的过程。
比如以下的…第二部分的作业是语法分析通过编写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行的注释。