编译原理实验二:赋值语句的语法分析程序设计

编译原理实验二:赋值语句的语法分析程序设计

1.1实验内容

目的:

  • 在前面实验的基础上,通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。

要求:

  • 设计出给定源语言中包含有算术表达式、关系表达式和逻辑表达式的赋值语句的文法,文法满足采用的语法分析方法的要求。
  • 选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。
  • 选择对各种常见程序语言都通用的语法结构,以文本文件形式输入源程序,把其中赋值语句作为分析对象进行语法检查,输出分析结果。

1.2实验分析

在本次的实验中呢,我采用的方法是递归下降法*(别问,问就是相对简单)*其实也还好,看各自感觉吧,然后我使用的语法是PL/0相关赋值语句的语法,如下:

〈赋值语句〉∷=〈标志符〉:=〈表达式〉
〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}
〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}
〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’

特别巧的是,由于本人的学术不精,刚开始并不知道递归下降法还需要求出相应的字符的select集,而且我使用的语法刚好是不需要往后看一个字符就可以完成的,所以,在验收的时候我才被老师说明白需要求出每个产生式的select,如果有需要参考我的代码的童鞋们可以自己加一下相关的部分哦,不是特别难。

递归下降法在我看来相对于其他几种方法都比较简单,是对每一个产生式进行分析,不同产生式对应的函数之间进行调用等,便可完成相应的功能。

1.3实验代码

赋值语句相应产生式的分析:

void assignment() {
     
	if (s == "ident") {
     
		flag = move();
		if (flag == 0) {
     
			cout << "语法错误 标识符后面缺项" << endl;
			success = 0;
			return;
		}
		if (s == "becomes") {
     
			flag = move();
			if (flag == 0) {
     
				cout << "语法错误 赋值符后面缺项" << endl;
				success = 0;
				return;
			}
			expression();
		}
		else {
     
			cout << "赋值语句中标识符后面缺少赋值符号" << endl;
			success = 0;
			return;
		}
	}
	else {
     
		cout << "赋值语句分析错误!" << endl;
		success = 0;
		return;
	}
}

表达式相应产生式的分析:

void expression() {
     
	if ((s == "plus") || (s == "minus")) {
     
		flag = move();
		if (flag == 0) {
     
			cout << "语法错误 加法运算符后面缺项" << endl;
			success = 0;
			return;
		}
	}
	item();
	if (!success) {
     
		return;
	}
	while ((s == "plus") || (s == "minus")) {
     
		flag = move();
		if (flag == 0) {
     
			cout << "语法错误 加法运算符后缺项" << endl;
			success = 0;
			return;
		}
		item();
		if (!success) {
     
			return;
		}
	}
}

项相应产生式的分析:

void item() {
     
	factor();
	if (!success) {
     
		return;
	}
	while ((s == "mul") || (s == "div")) {
     
		flag = move();
		if (flag == 0) {
     
			cout << "语法错误 乘法运算符后缺因子" << endl;
			success = 0;
			return;
		}
		factor();
		if (!success) {
     
			return;
		}
	}
}

因子相应产生式的分析:

void factor() {
     
	int lpnum = 0;
	if ((s == "ident") || (s == "number")) {
     
		flag = move();
		if (lpnum == 0 && s == "rparen") {
     
			cout << "语法错误 括号不匹配问题" << endl;
			success = 0;
			return;
		}
	}
	else if (s == "lparen") {
     
		lpnum++;
		flag = move();
		if (flag == 0) {
     
			cout << "语法错误 左括号后缺表达式" << endl;
			success = 0;
			return;
		}
		expression();
		if (!success) {
     
			return;
		}
		if (flag == 0 || s != "rparen") {
     
			cout << "语法错误 表达式后面缺少右括号" << endl;
			success = 0;
			return;
		}
		else {
     
			lpnum--;
			flag = move();
			if (flag == 0) {
     
				return;
			}
		}
	}
	else {
     
		cout << "语法错误 因子分析错误" << endl;
		success = 0;
		return;
	}
}

以上就是本次实验中主要的实现内容了,如果有不妥的地方希望大家帮忙指出哦,我们一起进步呀!

你可能感兴趣的:(编译原理,c++)