编译方法实验报告 姓 名 学 号 班 级 指 导 教 师 实验名称 中间代码生成器的设计 开 设 学 期 实 验 时 间 第周 评 定 成 绩 评定人 签 字 评 定 日 期 2011 年 10 月 一、 实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 二、 实验内容 (1)设计语法制导翻译生成表达式的四元式的算法; (2)编写代码并上机调试运行通过。 输入——算术表达式; 输出——语法分析结果; 相应的四元式序列。 (3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。 三、 实验原理及基本步骤 ●算术表达式文法: G(E): E E ω0 T | T T T ω1 F | F F i | (E) ●文法变换: G’(E) E T {ω0 T} T F {ω1 F} F i | (E) ●属性翻译文法: E T {ω0 “push(SYN, w)” T “QUAT”} T F {ω1 “push(SYN, w)” F “QUAT”} F i “push(SEM, entry(w))” | (E) 其中: push(SYN, w) — 当前单词 w 入算符栈 SYN; push(SEM, entry(w)) — 当前 w 在符号表中的入口值压入语义栈 SEM; QUAT — 生成四元式函数 i.T = newtemp; ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++; iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ ); push( SEM, T ); ●递归下降子程序: 数据结构:SYN —算符栈; SEM —语义栈; 四、 数据结构设计 使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来 while ( exp[i]=='+' || exp[i]=='-'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) T(); quat();} while ( exp[i]=='*' || exp[i]=='/'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) F(); quat();} void quat(){ strcpy(qt[j],"(, , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp); qt[j][1]=syn[i_syn]; qt[j][3]=sem[i_sem-1]; qt[j][5]=sem[i_sem]; qt[j][7]=temp; j++; i_syn--; //pop(SYN); i_sem--; //pop(SEM); i_sem--; //pop(SEM); sem[++i_sem]=temp; //push(SEM,temp); temp++;} 五、 关键代码分析(带注释)及运行结果 #include #include "string.h" #include "stdio.h" using n...