【实验目的】
通过上机实验,加深对语法制导翻译的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
【实验内容】
对给定的程序通过语义分析器能够判断语句串是否正确。正确则输出三地址指令形式的四元式代码,错误则抛出错误信息。
【设计思想】
(1)输入待分析的字符串。
语法如下:
a.关键字:begin,if,then,while,do,end.
b.运算符和界符::= + - * / < <= > >= <> = ; ( ) #
c.其他单词是标识符(ID)和整形常数(NUM):ID=letter(letter|digit)*,NUM=digitdigit*
d.空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
(2)扫描字符串,采用递归向下进行分析。
主要函数如下:
a.scaner()//词法分析函数,char token[8]用来存放构成单词符号的字符串;
b.parser()//语法分析,在语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。只对表达式、赋值语句进行翻译。
c.emit(char *result,char *arg1,char *op,char *ag2)//该函数功能是生成一个三地址语句返回四元式表中。
d.char *newtemp()//该函数返回一个新的临时变量名,临时变量名产生的顺序为T1,T2,…。
【实验要求】
四元式表的结构如下:
struct {char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(3)输出为三地址指令形式的四元式序列。
例如:语句串begin a:=2+3*4;x:=(a+b)/c;end#,
输出的三地址指令如下:
t1=3*4
t2=2+t1
a=t2
t3=a+b
t4=t3/c
x=t4
代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<stdlib.h> 5 using namespace std; 6 struct { 7 char result[12]; 8 char ag1[12]; 9 char op[12]; 10 char ag2[12]; 11 }quad; 12 //变量的定义 13 char prog[80], token[12]; 14 char ch; int syn, p, m = 0, n, sum = 0, kk; //p 是缓冲区 prog 的指针, m 是 token 的指针 15 char *rwtab[6] = { "begin", "if", "then", "while", "do", "end" }; 16 void scaner(); 17 char *factor(void); 18 char *term(void); 19 char *expression(void); 20 int yucu(); 21 void emit(char *result, char *ag1, char *op, char *ag2); 22 char *newtemp(); 23 int statement(); 24 int k = 0; 25 void emit(char *result, char *ag1, char *op, char *ag2) { 26 strcpy(quad.result, result); 27 strcpy(quad.ag1, ag1); 28 strcpy(quad.op, op); 29 strcpy(quad.ag2, ag2); 30 //cout<<quad.result<<"="<<quad.ag1<<quad.op<<quad.ag2<<endl; 31 cout << "( " << quad.op << ", " << "entry(" << quad.ag1 << "), " << "entry(" << quad.ag2 << "), " << quad.result << ") " << endl; 32 //cout<<"entry("<<quad.ag1<<"entry("<<quad.op<<quad.ag2<<endl; 33 } 34 char *newtemp() { 35 char *p; 36 char m[12]; 37 p = (char *)malloc(12); 38 k++; 39 _itoa_s(k, m, 10); 40 strcpy(p + 1, m); 41 p[0] = 't'; 42 return (p); 43 } 44 //对字符的扫描 45 void scaner() { 46 for (n = 0; n<8; n++) 47 token[n] = NULL; 48 ch = prog[p++]; 49 while (ch == ' ') { 50 ch = prog[p]; 51 p++; 52 } 53 if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')) { 54 if ((ch >= 'a'&&ch <= 'c') || (ch >= 'A'&&ch <= 'C')){ 55 m = 0; 56 while ((ch >= '0'&&ch <= '9') || (ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z')) { 57 token[m++] = ch; 58 ch = prog[p++]; 59 } 60 token[m++] = '