(最新版)实现技术--实验报告及源代码 北京交通大学

  • 格式:doc
  • 大小:686.00 KB
  • 文档页数:21

语义分析及中间代码生成程序设计原理与实现技术

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 right;

vector first;

vector last;

};

vector lang;

char mtr[9][9]; //算符优先矩阵

stack sta;

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;

temp.left = 'E';

temp.right.push_back("E+T");

temp.right.push_back("E-T");

temp.right.push_back("T");

temp.right.push_back("i");

temp1.left = 'T';

temp1.right.push_back("T*F");

temp1.right.push_back("T/F");

temp1.right.push_back("F");

temp2.left = 'F';

temp2.right.push_back("(E)");

temp2.right.push_back("i");

lang.push_back(temp);

lang.push_back(temp1);

lang.push_back(temp2);

cout << "****************************************" << endl;

cout << " 文法获取完成" << endl;

cout << "****************************************" << endl;

cout << endl;

}

void print(){

cout << "****************************************" << endl;

for(int i = 0;i < lang.size();i ++){

for(int j = 0;j < lang[i].right.size();j ++){

cout << lang[i].left << " --> ";

cout << lang[i].right[j] << endl;

}

}

cout << "****************************************" << endl;

cout << endl;

}

void fun(){

int i,j,sign = 0,sign1 = 0;

for(i = 0;i < lang.size();i ++){

for(j = 0;j < lang[i].right.size();j ++){

string temp = lang[i].right[j]; //获取右部

if(temp[0] > 'Z' || temp[0] < 'A'){ //终结符

lang[i].first.push_back(temp[0]);

}

else if(temp.length() >= 2){ //终结符

if(temp[1] > 'Z' || temp[1] < 'A'){

lang[i].first.push_back(temp[1]);

}

}

}

}

for(i = 0;i < lang.size();i ++){

for(j = 0;j < lang[i].right.size();j ++){

string temp = lang[i].right[j]; //获取右部

if((temp[0] > 'Z' || temp[0] < 'A') && temp.length() == 1){ //终结符

lang[i].last.push_back(temp[0]);

}

else if(temp.length() >= 3){ //终结符

if(temp[1] > 'Z' || temp[1] < 'A')

lang[i].last.push_back(temp[1]);

else if(temp[2] > 'Z' || temp[2] < 'A') //终结符

lang[i].last.push_back(temp[2]);

}

}

}

while(sign == 0){ //迭代FirstVT

sign = 1;

for(i = 0;i < lang.size();i ++){

for(j = 0;j < lang[i].right.size();j ++){