其他分享
首页 > 其他分享> > 武汉理工大学编译原理 课内实验

武汉理工大学编译原理 课内实验

作者:互联网

文章目录


前言

编译原理课设验收更水,只看结果。

主要仪器设备及耗材

1.PC机
2.c++集成环境


以下是本篇文章正文内容,下面案例可供参考

一、计算机高级语言的词法分析程序设计

实验内容描述

通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

完成对某一种常用高级语言(如PL/0语言)的各类单词的词法分析程序设计。
PL/0语言文法的EBNF描述:

〈程序〉∷= 〈分程序〉。
〈分程序〉∷= [〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉
〈常量说明部分〉∷= CONST〈常量定义〉{。〈常量定义〉};
〈常量定义〉∷= 〈标志符〉=〈无符号整数〉
〈无符号整数〉∷= 〈数字〉{〈数字〉}
〈变量说明部分〉∷= VAR〈标志符〉{,〈标志符〉};
〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉}
〈过程说明部分〉∷= 〈过程首部〉〈分程序〉{;〈过程说明部分〉};
〈过程首部〉∷= PROCEDURE〈标志符〉;
〈语句〉∷= 〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉
〈赋值语句〉∷= 〈标志符〉:=〈表达式〉
〈复合语句〉∷= BEGIN〈语句〉{;〈语句〉}END
〈条件〉∷= 〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉
〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}
〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}
〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’
〈加法运算符〉∷= +|-
〈乘法运算符〉∷= *|/
〈关系运算符〉∷=  =|#|<|>|<=|>=
〈条件语句〉∷= IF〈条件〉THEN〈语句〉
〈过程调用语句〉∷= CALL〈标志符〉
〈当型循环语句〉∷= WHILE〈条件〉DO〈语句〉
〈读语句〉∷= READ‘(’〈标志符〉{,〈标志符〉}‘)’
〈写语句〉∷= WRITE‘(’〈表达式〉{,〈表达式〉}‘)’
〈字母〉∷= a|b|…..|X|Y|Z
〈数字〉∷= 0|1|2|…..|8|9

实验基本原理与设计

在这里插入图片描述
1.数据结构的设计

class word
{
public:
	int species;//单词种别
	string values;//单词自身的值

	word(int s, string v)
	{
		this->species = s;
		this->values = v;
	}
};

2.核心算法的设计

//词法分析函数
word Lexicalanalysis()
{
	str1 = "";
	string ch;//存取读取的字符
	ch = str[index++];//读取一个字符
	while (ch == " ")ch = str[index++];//读取非空字符
	int flag = -1;//标识单词
	
	if (IS_Letter(ch)||ch=="_")
	{
		while (IS_Letter(ch) || IS_Number(ch)||ch=="_")//标识符的组成规则
		{
			str1 += ch;
			ch = str[index++];
		}

		ch = " ";
		index--;//读完后回退位置,防止错位,识别单词是保留字还是标识符

		//看是否是保留字
		for (int i = 0; i < len; i++)
		{
			if (str1 == Reserve[i])
			{
				flag = i;
				break;
			}
		}

		if (flag != -1)//保留字
		{
			return word(3, str1);
		}

		else
		{
			ite = Identifier.find(str1);//查找str1
			if (ite != Identifier.end())
			{
				return word(1, str1);
			}
			else
			{
				Identifier[str1] = Identifier.size();//没有str1就插入到标识符表末尾
				return word(1, str1);
			}
		}
	}

	else if(IS_Number(ch))
	{
		while (IS_Number(ch)||ch==".")
		{
			str1 += ch;
			ch = str[index++];
		}

		ch = " ";
		index--;//读完后回退位置

		ite = Constant.find(str1);//查找str1
		if (ite != Constant.end())
		{
			return word(2, str1);
		}
		else
		{
			Constant[str1] = Constant.size();//没有str1就插入到标识符表末尾
			return word(2, str1);
		}
	}
	else if(IS_Boundary(ch))
	{
		str1 += ch;
		return word(5, str1);
	}
	else if (IS_Operator(ch))
	{
		while (IS_Operator(ch))
		{
			str1 += ch;
			ch = str[index++];
		}

		ch = " ";
		index--;//读完后回退位置

		//检查是否存在复合运算符
		for (int i = 0; i < len1; i++)
		{
			if (str1 == Operator[i])
			{
                return word(4, str1);
			}
			else
			{
				return word(4, str1);
			}
		}
	}
	else
	{
		fout <<ch<< " 无法识别的单词" << endl;
		return word(0, "0");
	}
}

核心的词法分析函数对扫描的每一个字符,进行判断,分别对保留字、标识符、常数、界符、运算符五种类型的单词进行识别,其中标识符和常数按照其文法进行循环识别,满足其条件就将其按相应类别进行输出。

二、赋值语句的语法分析程序设计与实现

实验内容描述

简单赋值语句的文法G:

〈赋值语句〉∷= 〈标识符〉=〈表达式〉
〈表达式〉∷= 单目算符〈表达式〉|〈项〉|〈表达式〉〈加法运算符〉〈项〉 
〈项〉∷= 〈因子〉|〈项〉〈乘法运算符〉〈因子〉 
〈因子〉∷= 〈标志符〉|〈无符号整数〉|(〈表达式〉) 
〈无符号整数〉∷= 〈数字〉|〈无符号整数〉〈数字〉 
〈标志符〉∷= 〈字母〉|〈标志符〉〈字母〉|〈标志符〉〈数字〉 
〈加法运算符〉∷= +|- 
〈乘法运算符〉∷= *|/ 

对于常用高级语言(如Pascal、C语言)的赋值语句用所学过的语法分析方法进行语法分析,并把源程序翻译成为语法树(采用适当的形式)作为输出结果输出到文件中。

实验基本原理与设计

采用递归下降法实现,实验报告略有瑕疵,但是源工程用递归下降法实现,输出为四元式。


总结

详情可参考以下链接:
链接:冲冲冲~
提取码:q6vi
复制这段内容后打开百度网盘手机App,操作更方便哦

标签:语句,ch,word,str1,运算符,编译,标志符,武汉理工大学,课内
来源: https://blog.csdn.net/mo_zhe/article/details/113743759