欢迎来到天天文库
浏览记录
ID:38698990
大小:149.50 KB
页数:5页
时间:2019-06-17
《实验五+中间代码生成器》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验5中间代码生成器一、实验目的掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。二、实验内容在实验四用Yacc生成的语法分析器基础上加入语义动作,编写一个中间代码生成程序。1.文法(见教材附录A.1,p394)program→blockblock→{declsstmts}decls→declsdecl
2、edecl→typeid;type→type[num]//数组可以不做
3、basic//四种基本数据类型int
4、float
5、char
6、boolstmts→ stmtsstmt
7、estmt→i
8、d=expr;
9、if(bool)stmt
10、if(bool)stmtelsestmt
11、while(bool)stmt
12、dostmtwhile(bool);
13、break;//break可以不做
14、blockbool→bool
15、
16、join
17、joinjoin→join&&equality
18、equalityequality→equality==rel
19、equality!=rel
20、relrel→expr21、expr<=expr22、expr>expr23、expr>=expr24、exprexpr→expr+term25、expr-term26、termter27、m→term*unary28、term/unary29、unaryunary→!unary30、-unary31、factorfactor→(expr)32、id33、num 2.中间代码的形式见教材p221~222,若有必要,可以适当扩展(加以说明)。三、实验过程3.1符号表的定义和相关函数structSymbolElemstructSymbolListSymbolListCreateSymbolList(SymbolListPrevList,intStartAddr)/*创建并返回一个新的符号表(SymbolList就是书上的Env),PrevList是34、其的上一层符号表*/voidDestroySymbolList(SymbolListList)structSymbolElem*LookUpSymbolList(SymbolListList,char*IdName)/*在符号表List中查找是否存在标识符IdName,如果存在,则返回该结点指针,否则返回空*/structSymbolElem*LookUpAllSymbolList(SymbolListList,char*IdName)/*从符号表List开始并不断地往上一层符号表中查找是否存在标识符IdName,如果存在,则返回该结35、点指针,否则返回空*/structSymbolElem*AddToSymbolList(SymbolListList,char*IdName,intIdType,intWidth)/*创建一个新的符号结点,并添加到符号表中,而后返回该结点指针*/3.2常数表的定义和相关函数unionConstVal/*存放一个常数*/structConstElem/*常量表*/structConstList/*创建并返回常量表*/voidCreateConstList(intStartAddr)voidDestroyConstList(void)/*36、在常量表ConstList中查找是否存在常量,如果存在,则返回该结点指针,否则返回空*/structConstElem*LookUpConstList(intConstType,unionConstValConstValue,intWidth)/*创建一个新的常数结点,并添加到常数表中,而后返回该结点指针*/structConstElem*AddToConstList(char*Str,intConstType,unionConstValConstValue,intWidth)3.3四元式的定义和函数/*四元式数据结构*/struct37、Quadruple/*四元式表*/structQuadTablevoidCreateQuadTable(intStartAddr)voidDestroyQuadTable(void)/*当Arg1是变量或临时变量时,Arg1Name是该变量的名称,用于演示时使用,其余参数类同*/intGen(intOp,intArg1,intArg2,intArg3,char*Arg1Name,char*Arg2Name,char*Arg3Name)/*把四元式所对应的三地址代码写入到文件中*/voidWriteQuadTableToFile(con38、stchar*FileName)四、实验结果源程序片断运行状态图运行结果五、心得体会本次实验很难,做了很久都没做出来。不过在这个过程中,加深了我对中间代码生成的了解。最近在参考网上资料和同学代码的情况下做出来了。
21、expr<=expr
22、expr>expr
23、expr>=expr
24、exprexpr→expr+term
25、expr-term
26、termter
27、m→term*unary
28、term/unary
29、unaryunary→!unary
30、-unary
31、factorfactor→(expr)
32、id
33、num 2.中间代码的形式见教材p221~222,若有必要,可以适当扩展(加以说明)。三、实验过程3.1符号表的定义和相关函数structSymbolElemstructSymbolListSymbolListCreateSymbolList(SymbolListPrevList,intStartAddr)/*创建并返回一个新的符号表(SymbolList就是书上的Env),PrevList是
34、其的上一层符号表*/voidDestroySymbolList(SymbolListList)structSymbolElem*LookUpSymbolList(SymbolListList,char*IdName)/*在符号表List中查找是否存在标识符IdName,如果存在,则返回该结点指针,否则返回空*/structSymbolElem*LookUpAllSymbolList(SymbolListList,char*IdName)/*从符号表List开始并不断地往上一层符号表中查找是否存在标识符IdName,如果存在,则返回该结
35、点指针,否则返回空*/structSymbolElem*AddToSymbolList(SymbolListList,char*IdName,intIdType,intWidth)/*创建一个新的符号结点,并添加到符号表中,而后返回该结点指针*/3.2常数表的定义和相关函数unionConstVal/*存放一个常数*/structConstElem/*常量表*/structConstList/*创建并返回常量表*/voidCreateConstList(intStartAddr)voidDestroyConstList(void)/*
36、在常量表ConstList中查找是否存在常量,如果存在,则返回该结点指针,否则返回空*/structConstElem*LookUpConstList(intConstType,unionConstValConstValue,intWidth)/*创建一个新的常数结点,并添加到常数表中,而后返回该结点指针*/structConstElem*AddToConstList(char*Str,intConstType,unionConstValConstValue,intWidth)3.3四元式的定义和函数/*四元式数据结构*/struct
37、Quadruple/*四元式表*/structQuadTablevoidCreateQuadTable(intStartAddr)voidDestroyQuadTable(void)/*当Arg1是变量或临时变量时,Arg1Name是该变量的名称,用于演示时使用,其余参数类同*/intGen(intOp,intArg1,intArg2,intArg3,char*Arg1Name,char*Arg2Name,char*Arg3Name)/*把四元式所对应的三地址代码写入到文件中*/voidWriteQuadTableToFile(con
38、stchar*FileName)四、实验结果源程序片断运行状态图运行结果五、心得体会本次实验很难,做了很久都没做出来。不过在这个过程中,加深了我对中间代码生成的了解。最近在参考网上资料和同学代码的情况下做出来了。
此文档下载收益归作者所有