在计算机体系结构设计时,编译器在处理器设计阶段就进行开发,然后编译得到代码并运行在模拟器上,这些代码被用来评价提议的体系结构特征。
语法制导翻译:在使用类似于yacc这样的解析器生成器时,除了需要写出语法规则之外,还需要提供与当规则被应用时执行的语义动作。在单遍编译器中,因为无法保存中间结果,就直接是代码生成; 而在常见的多遍编译器中,则是构造AST。所有在语法分析过程中执行的语义动作,就叫做语法制导翻译。
回忆一下yacc的使用。yacc输出的代码是由三部分构成的
- parser driver:这部分通常是模版代码,在不同的yacc-generated parser中是一样或类似的。
- parseing table:由yacc对语法规则分析后产生的数据,与arser driver结合在一起就是一个完整的parser。
- syntactic actions: 单单一个parser用处不大,我们为每条规则提供的语义动作就被嵌入到模版代码中,当相应的规则被应用时,由parser driver负责执行。这部分也就是本章讨论的内容。
在javacc中,构造AST用的是jjtree xxxx.jjt.
见examples中的JJTreeexamples.
在语义分析中(比如typecheking),前提是要有个正确的符号表。
任何程序设计语言都支持函数,函数调用可以嵌套和多次实例化。
本地变量的层层创建与销毁,依赖于栈的应用。
在编译原理中,处理以上问题的,叫做activation record.
语义分析的最重要一步就是中间代码生成。
IR(intermediate representation)有好多种形式,在modern compiler implementation
using Java中,用的是intermediate representation tree.
package Tree;
abstract class Exp
CONST(int value)
NAME(Label label)
TEMP(Temp.Temp temp)
BINOP(int binop, Exp left, Exp right)
MEM(Exp exp)
CALL(Exp func, ExpList args)
ESEQ(Stm stm, Exp exp)
abstract class Stm
MOVE(Exp dst, Exp src)
EXP(Exp exp)
JUMP(Exp exp, Temp.LabelList targets)
CJUMP(int relop, Exp left, Exp right, Label iftrue, Label iffalse)
SEQ(Stm left, Stm right)
LABEL(Label label)
other classes:
ExpList(Exp head, ExpList tail)
StmList(Stm head, StmList tail)
other constants:
final static int BINOP.PLUS, BINOP.MINUS, BINOP.MUL, BINOP.DIV, BINOP.AND,
BINOP.OR, BINOP.LSHIFT, BINOP.RSHIFT, BINOP.ARSHIFT, BINOP.XOR;
final static int CJUMP.EQ, CJUMP.NE, CJUMP.LT, CJUMP.GT, CJUMP.LE,
CJUMP.GE, CJUMP.ULT, CJUMP.ULE, CJUMP.UGT, CJUMP.UGE;
翻译时,涉及到表达式的翻译,变量声明的翻译,数组下标的处理,控制流的翻译,函数调用的翻译
没有评论:
发表评论