文档介绍:编译方法实验报告
姓名
学号
班级
指导教师
实验名称
中间代码生成器的设计
开设学期
实验时间
第周
评定成绩
评定人签字
评定日期
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 —生成四元式函数
= newtemp;
[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;
( 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 <iostream>
#includ