写在前面
纯粹,为了记录.
以后某一天,回过头来看看.给大学留些痕迹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);
}
}