语义分析与中间代码生成程序的设计原理与实现技术__实验报告与源代码_北京交通大学
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语义分析及中间代码生成程序设计原理与实现技术
XXX 1028XXX2 计科1XXX班
1.程序功能描述
完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过
程。
G[A]:A→V:=E
E→E+T∣E-T∣
T→T*F∣T/F∣F
F→(E)∣i
V→i
说明:终结符号i 为用户定义的简单变量,即标识符的定义。
2. 设计要求
(1)给出每一产生式对应的语义动作;(2)设计中间代码四元式的结构(暂不与符号表有关)。(3)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串的四元式序列中间文件。(4)设计两个测试用例(尽可能完备),并给出程序执行结果四元式序列。
3.主要数据结构描述:
本程序采用的是算符优先文法,文法以及算符优先矩阵是根据第四次实验来修改的,所以主要的数据结构也跟第四次差不多,主要为文法的表示,FirstVT集和LastVT 集以及算符优先矩阵:
算符优先矩阵采用二维字符数组表示的:
char mtr[9][9]; //算符优先矩阵
4.程序结构描述:
本程序一共有8功能函数:
void get(); //获取文法
void print(); //打印文法
void fun(); //求FirstVT 和LastVT
void matrix(); //求算符优先矩阵
void test(); //测试文法
int cmp(char a,char b); 比较两个运算符的优先级 1 0 -1
void out(char now,int avg1,int avg2); //打印四元式
int ope(char op,int a,int b); //定义四元式计算方法
5.实验代码
详见附件
6.程序测试
6.1 功能测试
程序运行显示如下功能菜单:
选择打印文法:
选择构造FirstVt集和LastVT集:
选择构造算符优先矩阵:
6.2 文法测试
测试1:1+2*3
测试2:2+3+4*5+(6/2)
7.学习总结
本次实验完成了语义及中间代码生成的设计原理与实现,所采用的方法为算符优先分析方法,首先根据文法求出此文法的FirstVT集和LastVT集,然后根据他们求出此文法的算符优先矩阵。由于此文法和第四次文法基本相同,只是多了一条赋值语句,所以采用的规则和第四次基本相同。在分析阶段,每当遇到有规约的项目,判断一下,打印出此部运算的四元式,这样一步一步分析,知道输入的算术表达式计算分析完毕。
由于本次实验部分代码和第四次实验的代码比较相似,只需增加一点四元式的分析计算打印过程,就能够顺利完成本次实验。
通过这次实验,我对语义分析以及中间代码部分有了一定的提高,对以后的学习有了一定程度上的帮助。
// lb6.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
struct info{
char left;
vector
vector
vector
};
vector
char mtr[9][9]; //算符优先矩阵
stack
void get(); //获取文法
void print(); //打印文法
void fun(); //求FirstVT 和LastVT
void matrix(); //求算符优先矩阵
void test(); //测试文法
int cmp(char a,char b); //比较两个运算符的优先级 1 0 -1
void out(char now,int avg1,int avg2); //打印四元式
int ope(char op,int a,int b); //定义四元式计算方法
int main(){
int choose;
while(1){
cout << "****************************************" << endl;
cout << " 获取文法请按1" << endl;
cout << " 打印文法请按2" << endl;
cout << " 构造FirstVT集和LastVT集请按3" << endl;
cout << " 构造优先关系矩阵请按4" << endl;
cout << " 文法测试请按5" << endl;
cout << " 结束请按0" << endl;
cout << "****************************************" << endl;
cout << endl;
cin >> choose;
if(choose == 0)
break;
switch(choose){
case 1: get(); break;
case 2: print(); break;
case 3: fun(); break;
case 4: matrix(); break;
case 5: test(); break;
default:break;
}
}
return 0;
}
void get(){
info temp,temp1,temp2;