正在加载图片...
China-pub.Com 第8章代码生成 315 下载 typedef struct streenode NodeKind kind; Optype op:/used with OpKind + struct streenode +lchild,*rchild; int val;/used with ConstKind + chart strval; used for identifiers and numbers 】STreeNode typedef STreeNode *SyntaxTree; 用这些定义,表达式(x=x+3)+4的语法树如下所示 注意,赋值节点包含了要被赋于的表达式(在stxv1域中),以致一个赋值节点只有一个 子树(要被赋于的表达式)⊙。 基于这棵语法树的结构,我们能写出一个gencode过程来产生程序清单8-7的P.代码。对 图中的代码作如下注释:首先,代码用标准C函数sprintf把字符串连接到本地的临时变量 codestr。其次,调用过程emitCode/用以生成一个P代码行,在数据结构或输出文件中不显 示它的细节。最后,两个操作符(加号和赋值号)需要两个不同的遍历顺序,加号仅需要一些后 序处理,而赋值需要一些前序处理和一些后序处理。因此不可能在所有情况下,能将递归调用 都写成一个样子。 程序清单8-7表81属性文法定义的P码的代码生成过程的实现 .co0E8工zE。max1 ength of11in0oEP-cod0*/ Bw1Ech(化->op】 case Plus: ge tcode(adi") break; destr,"%8s "lda",t->strval) gencode(t->1child) 日在这个例子中,我们将数字也当作字符申保存在strva1域中。typedef struct streenode { NodeKind kind; Optype op; /* used with OpKind */ struct streenode *lchild, *rchild; int val; /* used with ConstKind */ char * strval; /* used for identifiers and numbers */ } STreeNode; typedef STreeNode *SyntaxTree; 用这些定义,表达式( x = x + 3 ) + 4的语法树如下所示: 注意,赋值节点包含了要被赋于的表达式 (在s t r v a l域中),以致一个赋值节点只有一个 子树(要被赋于的表达式) 。 基于这棵语法树的结构,我们能写出一个 g e n C o d e过程来产生程序清单 8 - 7的P -代码。对 图中的代码作如下注释:首先,代码用标准 C函数s p r i n t f把字符串连接到本地的临时变量 c o d e s t r。其次,调用过程e m i t C o d e用以生成一个P -代码行,在数据结构或输出文件中不显 示它的细节。最后,两个操作符 (加号和赋值号)需要两个不同的遍历顺序,加号仅需要一些后 序处理,而赋值需要一些前序处理和一些后序处理。因此不可能在所有情况下,能将递归调用 都写成一个样子。 程序清单8-7 表8 - 1属性文法定义的P -码的代码生成过程的实现 第 8章 代 码 生 成 3 1 5 下载 在这个例子中,我们将数字也当作字符串保存在s t r v a l域中
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有