一、实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
二、实验要求
采用
递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
三、实验的结果验证
1.输入是语法分析后提供的正确的单词串,输出为三地址指令形式的四元式序列。
给出语句串:
begin_a:=2+3*4; _x:=(a+b)/c_end#
输出如下三地址指令:
(1) t1=3*4
(2) t2=2+t1
(3) a=t2
(4) t3=a+b
(5) t4=t3/c
(6) x=t4
2.自己任意给出一语句串,输出四元式序列。
要求:将上述2个语句串的执行结果显示保留在实验报告中(拷屏)。
四、算法思想
1、设置语义过程。
(1)emit(char *result,char *ag1,char *op,char *ag2)
该函数的功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:
struct{char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2) char *newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…
char *newtemp(void)
{char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
2、函数lrparser 在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。
五、语义分析程序的C程序。
#include
#include
#include
#include
struct {char result[12];
char ag1[12];
char op[12];
char ag2[12];
}quad;
char prog[80],token[12];
char ch;
int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
char *factor(void);
char *term(void);
char *expression(void);
int yucu();
void emit(char *result,char *ag1,char *op,char *ag2);
char *newtemp();
int statement();
int k=0;
void emit(char *result,char *ag1,char *op,char *ag2)
{ strcpy(quad.result,result);
strcpy(参数设置);
strcpy(quad.op,op);
strcpy(quad.ag2,ag2);
cout<
1