编译原理 实验3

写在前面

纯粹,为了记录.
以后某一天,回过头来看看.给大学留些痕迹hh.
PS:很多思路也都是学习前辈们的,如果能顺便帮到你,不客气!

参考文章:https://blog.csdn.net/niu91/article/details/9155509

内容

编译原理 实验3
递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否是文法的句子。
对于给定的文法G[E]
E->TE’
E’->+TE’ | ε
T->FT’
T’->*F T’| ε
F-> (E) | id
采用递归下降语法分析法编写语法分析程序,该语法分析程序判断输入的字符串是否符合上述文法,并能够输出相应的结果(是语法成分或不是语法成分)。

源代码

//自顶向下递归语法分析
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

/*
文法:
1) E->TE'
2) E'->+TE'|空串
3) T->FT'
4) T'->*FT"|空串
5) F->(E)|i  //将识别的id简化为字母i
*/
void E();
void E_();
void T();
void T_();
void F();
void init_word();	//预处理单词序列

int index;	//当前指针位置
string word;	//存放识别的单词序列


/********************************************
* 功能:识别算术表达式(运算单位简化为i,识别加法与乘法,可带括号)
* 输入参数:
* 返回类型:
* 说明:主函数
*********************************************/
int main() {

	cin >> word;	//输入要识别的单词序列

	init_word();
	E();	//

	/*调试使用*/
//	cout << word << endl;
//	cout << "长度为 " << word.length() << endl;
//	cout << "index = " << index << endl;

	/*若识别至单词末尾,则恰好扫描了整个语法串,表明是语法成分*/
	if (word[index] == '#') {
		cout << "识别成功,是语法成分!" << endl;
	} else {
		cout << "非语法成分!";
	}

	return 0;
}

/********************************************
* 功能:预处理一下单词序列,尾部加上'#'号,标识尾部
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void init_word() {
	index = 0;	//指针指向单词序列第一个字符
	word += "#";
}

/********************************************
* 功能:E过程,
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void E() {
	T();		//非终结符T
	E_();	//非终结符E'
}

/********************************************
* 功能:E'过程
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void E_() {
	if (word[index] == '+') {
		index ++ ;	//识别完终结符'+'后,指针后移
		T();
		E_();
	}
	//空串的情况
	else {
		return;
	}
}

/********************************************
* 功能:T过程
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void T() {
	F();
	T_();	//非终结符T’
}

/********************************************
* 功能:T'过程
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void T_() {
	if (word[index] == '*') {
		index ++ ;	//识别完终结符'*'后,index ++
		F();
		T_();
	}
	//空串的情况
	else {
		return;
	}
}

/********************************************
* 功能:F过程
* 输入参数:
* 返回类型:
* 说明:
*********************************************/
void F() {
	//识别到候选式子:i
	if (word[index] == 'i') {
		index ++ ;	//识别到非终结符'i'
	}
	//识别到候选式子:(E)
	else if (word[index] == '(') {
		index ++ ;
		E();
		//下一个非终结符应是')',若不是,则发生了错误
		if (word[index] == ')') {
			index ++ ;
		}
		//错误处理
		else {
			cout << "发生错误,未匹配右括号!" << endl;
			exit(0);
		}
	}
	//错误处理
	else {
		cout << "发生错误,F()未成功匹配候选式子!" << endl;
		exit(0);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值