【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)

:本文记录 WHUT-计算机学院-编译原理 课程 课内实践

项目下载地址:https://download.csdn.net/download/cxh_1231/10916735

纸上得来终觉浅,觉知此事需躬行!

0、笔者:

编译原理课程一共有两次实验和一次课内实践。前两次实验分别是:

  • 赋值语句的词法分析程序设计与实现
  • 赋值语句的语义分析程序设计与实现

而课内实践的内容是:WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)

所以我就以实践为目标,从最开始就按照实践的内容来做,首先实现词法分析,然后语法分析、语义分析,输出中间结果四元式。整个过程一气呵成。所以也可以作为前面实验的内容来参考。

 

1、实践内容:

课内实践任务书

学生姓名:             专业班级:                

指导教师:   林老师       工作单位: 计算机科学与技术学院  

题目: WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)

初始条件:

  • 理论:掌握编译理论、技术、方法、掌握一种计算机高级语言的使用。

  • 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。

要求完成的主要任务: (包括实践工作量及其技术要求,以及报告撰写等具体要求)

  • 写出符合给定的语法分析方法的文法及属性文法。
  • 完成题目要求的中间代码四元式的描述。
  • 写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
  • 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
  • 设计报告格式按附件要求书写。课内实践报告书正文的内容应包括:
  1. 1 系统描述(问题域描述);

  2. 2 文法及属性文法的描述;

  3. 3 语法分析方法描述及语法分析表设计;

  4. 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;

  5. 5 编译系统的概要设计;

  6. 6 详细的算法描述(流程图或伪代码);

  7. 7 软件的测试方法和测试结果;

  8. 8本设计的评价、特点、不足、收获与体会等。

 

2、运行截图:

【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)_第1张图片

 

3、部分代码:

仅提供部分代码,以供参考。

下面代码不能运行!不能运行!不能运行!

可以运行的代码:https://download.csdn.net/download/cxh_1231/10916735

/*
			编译原理课内实践
	While循环语句的翻译程序设计与实现
		递归下降法	输出四元式
*/

#include 
#include 
#include 
#include 
#include 

using namespace std;
#define ERROR 0;
#define OK 1;

void anasyProgram(string program);
void listWord();
void anasyWord();
//保存拆开后的单个符号
struct Word{
	string oneword;
	string type;
};
Word word[1000];
//程序单词个数;
int num = 0;
char suanshi[100];
int suanshinum = 0;

//读入源程序
void inputProgram() {
	//首先将整个txt文件读入到program字符串里
	ifstream in("program.txt", ios::in);
	istreambuf_iterator beg(in), end;
	string program(beg, end);//或者string st;st.assign(beg,end);
	in.close();

	anasyProgram(program);
}

/********词法分析阶段**********/

//判端是界符:返回真
bool isDelimiter(char ch) {
	if (ch == '(' || ch == ')' || ch == ';' || ch == '{' || ch == '}')
		return true;
	else 
		return false;
}
//判断是字母:返回真
bool isLetter(char ch) {
	if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) 
		return true;
	else 
		return false;
}
//判断是数字:返回真
bool isNumber(char ch) {
	if(ch >= '0' && ch <= '9')
		return true;
	else
		return false;
}
//判断是运算符:返回真
bool isOperator(char ch) {
	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '>' || ch == '<' || ch == '=' || ch == '!' || ch=='|' || ch=='&')
		return true;
	else return false;
}

//词法分析:分析程序,将每个单词拆分,放在Word结构体数组中
void anasyProgram(string program) {
	string temp;

	//测试:输出整个程序
	cout << "源程序:\n" << program << endl << endl;
	
	//测试:输出程序字母符号个数
	//cout << program.size() << endl;

	//进行拆分
	for (int i = 0; i < program.size(); i++) {

		//遇到空格,临时字符串清空
		if (program[i] == ' ') {
			temp = "";
			//cout << "已清空temp!" << endl;
			continue;
		}

		/*界符分析:{、}、(、)、;  */
		else if (temp.size() == 0 && isDelimiter(program[i])) {

			//自行完成

			continue;
		}

		/*标识符分析(也有可能是关键字):首位必须为字母*/
		else if (temp.size() == 0 && isLetter(program[i])) {

			//自行完成

		}

		/*运算符分析:+、-、 *、/、+=、-=、*=、/=、>、<、=、==、!=、>=、<=、||、&& */  /*暂时忽略++  --  */
		else if (temp.size() == 0 && isOperator(program[i])) {

			//自行完成

		}

		/*数字分析:首位为数字,则必须为数字,否则错误!*/
		else if (temp.size() == 0 && isNumber(program[i])) {

			//自行完成

			continue;
		}
	}

}

void listWord() {
	for (int i = 0; i < num; i++) {
		cout << word[i].type << "\t:" << word[i].oneword << endl;
	}
}

/*********语法分析阶段***********/
void isDelimiter(int i);
void isOperator(int i);
void isNumber(int i);

//标识符
void isIdentifier(int i) {
	if (word[i+1].type == "界符") {
		isDelimiter(i + 1);
	}
	else if (word[i+1].type == "运算符") {
		isOperator(i + 1);
	}
	else {
		cout << word[i].type << word[i].oneword << "后边接" << word[i + 1].type <<",语法错误!"<< endl;
	}

}

//运算符
void isOperator(int i) {
	if (word[i + 1].type == "标识符") {
		isIdentifier(i + 1);
	}
	else if (word[i+1].type=="常数") {
		isNumber(i + 1);
	}
	else if (word[i+1].oneword=="++" || word[i + 1].oneword == "--") {

	}
	else {
		cout << word[i].type << word[i].oneword << "后边接" << word[i + 1].type << ",语法错误!" << endl;
	}
}

//界符
void isDelimiter(int i) {

}

void isNumber(int i) {

}

/********使用文法解决*******/
void do_S();						//S→while(A){B}
void do_A();						//A→CDC
void do_D(string &tempD);			//D→优先关系
void do_B();						//B→i=C;
void do_C(string &tempC);			//C→ EG
void do_E(string &tempE);			//E→ FH
void do_G(queue &tempG);	//G→ +EG | -EG | 空
void do_F(string &tempF);			//F→ (C) | i | n
void do_H(queue &tempH);	//H→ *FH | /FH | 空

//四元式:OP为操作符,result=arg1+arg2;
struct Siyuanshi {
	string op;
	string arg1;
	string arg2;
	string result;
};
Siyuanshi siyuanshi[100];
int siyuanshiNum = 0;//四元式个数

int nowword = 0;
int anasyWordResult=OK;
int newtemp = 1;
int JumpType = 0;


void do_S(){
	//自行完成
}

void do_A(){
	//自行完成
}

void do_D(string &tempD){
	//自行完成
	   
}

void do_B(){
	//自行完成
}

void do_C(string &tempC){
	//自行完成
}

void do_E(string &tempE){	
	//自行完成
}

void do_G(queue &tempG){
	//自行完成
}

void do_F(string & tempF){
	//自行完成
}

void do_H(queue &tempH){
	//自行完成
}

//语法分析:分析单词,将单词之间的正误进行判断整理,提示输出
void anasyWord(){
	do_S();
}

/*输出四元式*/
void printSiyuanshi() {
	//自行完成
}

int main() {

	inputProgram();

	/*测试*/
	//for (int i = 0; i < suanshinum; i++) {
	//	cout << suanshi[i];
	//}

	//采用递归下降法语义分析
	anasyWord();

	if (anasyWordResult == 1) {
		cout << "\n语法分析正确!" << endl ;
		listWord();
		printSiyuanshi();
	}
	
	return 0;
}

 

你可能感兴趣的:(操作系统&编译原理)