语法分析器

news/2025/1/9 12:33:55/

运行截图

在这里插入图片描述

代码

#include<iostream>
#include<map>
#include <string>
#include <stack>      
#include<queue>
#include<algorithm>
using namespace std;
/*multimap<string, multimap<char, string>> table; //分析表
multimap<string, multimap<char, string>>::iterator muliter;//外部map迭代器
multimap<char, string>::iterator iter;    //内部map迭代器*/
map<string, map<char, string>> table; //分析表
map<string, map<char, string>>::iterator muliter;//外部map迭代器
map<char, string>::iterator iter;    //内部map迭代器
string vt = "i+*()"; //非终结符集
stack<string> a;    //分析栈
queue<char> b;        //输入串
string x;//栈顶符号
string css;//对应产生式
string symbol;//逆序入栈
void init() {        //分析表初始化 /*multimap<char, string> inside;inside.insert(make_pair('i', "TE'"));inside.insert(make_pair('(', "TE'"));table.insert(make_pair("E", inside));inside.clear();inside.insert(make_pair('+', "+TE'"));inside.insert(make_pair(')', "0"));inside.insert(make_pair('#', "0"));table.insert(make_pair("E'", inside));inside.clear();inside.insert(make_pair('i', "FT'"));inside.insert(make_pair('(', "FT'"));table.insert(make_pair("T", inside));inside.clear();inside.insert(make_pair('+', "0"));inside.insert(make_pair('*', "*FT'"));inside.insert(make_pair(')', "0"));inside.insert(make_pair('#', "0"));table.insert(make_pair("T'", inside));inside.clear();inside.insert(make_pair('i', "i"));inside.insert(make_pair('(', "(E)"));table.insert(make_pair("F", inside));inside.clear();*/table["E"]['i'] = "TE'";table["E"]['('] = "TE'";table["E'"]['+'] = "+TE'";table["E'"][')'] = "0";table["E'"]['#'] = "0";table["T"]['i'] = "FT'";table["T"]['('] = "FT'";table["T'"]['+'] = "0";table["T'"]['*'] = "*FT'";table["T'"][')'] = "0";table["T'"]['#'] = "0";table["F"]['i'] = "i";table["F"]['('] = "(E)";
}void analyze() {a.push("#");a.push("E");char tar = b.front();  //要匹配的符号bool flag = true;muliter = table.begin();iter = muliter->second.begin();while (flag) {string x = a.top();// 栈顶符号if (vt.find(x[0])!=vt.npos) {//栈顶符号是否属于终结符集合if (x[0] == tar) {//是否匹配cout << "栈顶符号=" << a.top() << "   匹配字符=" << tar << "    匹配成功" << endl;b.pop();a.pop();tar = b.front();}else {cout << "栈顶符号不属于终结符集合" << endl;}    }else {if (x == "#") {if (x[0] == tar) {    flag = false;}else {cout << "x!=#" << endl;}}else {if ((muliter=table.find(a.top())) != table.end() && (iter=muliter->second.find(tar)) != muliter->second.end()) {//是否有对应产生式string css = iter->second;cout << "栈顶符号=" << a.top() << "   匹配字符=" << tar << "   对应产生式=" << a.top() << "->" << css << endl;if (css == "0") {// 0代表空a.pop();continue;}a.pop();while (!css.empty()) {            //将产生式逆序入栈    //*********此处可应用词法分析器*********if (css[css.size() - 1] == '\'') {string symbol(css, css.size() - 2);a.push(symbol);css.erase(css.size() - 2, 2);}else {string symbol(css, css.size() - 1);a.push(symbol);css.erase(css.size() - 1, 1);}}}else {cout << "没有对应产生式" << endl;break;}}}}if (flag == true) {            //出现错误break跳出时,说明语法错误cout << "语法错误" << endl;}else {                        cout << "语法正确" << endl;}
}
int main() {//初始化init();//输出分析表for (muliter = table.begin(); muliter != table.end(); muliter++) {for (iter = muliter->second.begin(); iter != muliter->second.end(); iter++)cout << "(" << muliter->first << ", " << iter->first << ")   ->  (" << iter->second << ")" << endl;}//输入所需分析串并入队cout << "请输入所需分析字符串:";while (1) {char c;cin >> c;b.push(c);if (c == '#')break;}//进行分析analyze();//输出串return 0;
}

http://www.ppmy.cn/news/274213.html

相关文章

HackRequests+BeautifulSoup+re爬取网站网址

先用语法搜索一波想要爬取的网站 点击页码&#xff0c;抓包看看请求头&#xff0c;多抓几个放入对比器找到页码参数 可以看到页码参数为pn&#xff0c;第一页为0&#xff0c;第二页为10&#xff0c;第五页为40&#xff0c;可以知道每一页pn增加10&#xff0c;写python脚本。…

江苏全国计算机补报,江苏2017中级会计补报名时间 错过报名还有机会补报吗

江苏2017年中级会计职称考试报名已经结束&#xff0c;网上报名时间为3月1日-30日&#xff0c;网上交费时间为3月26日-4月5日&#xff0c;资格审核时间为3月26日-31日。没有在以上时间完成报名的考生的都是没有成功报名&#xff01;那么错过报名时间&#xff0c;江苏2017中级会计…

计算机信息检索系统中常用的检索技术,在计算机信息检索系统中,常用的检索技术主要有哪些...

满意答案 蒙奇奇.011703 推荐于 2018.05.21 采纳率&#xff1a;47% 等级&#xff1a;12 已帮助&#xff1a;8418人 在计算机信息检索系统中&#xff0c;常用的检索技术主要有以下六种&#xff1a; 1&#xff0e; 布尔逻辑检索 利用布尔逻辑算符进行检索词或代码的逻辑组配&a…

Web目录文件扫描程序(python)

使用方法 首先找个网站&#xff0c;我们可以看到URL中有php后缀名&#xff0c;说明该网站为php网站 输入参数&#xff1a;URL,文件类型&#xff0c;线程数&#xff0c;即可扫出目录文件 验证一下&#xff0c;访问成功 代码 环境 pycharm&#xff0c;python3.9 文件结构 …

会计行业被计算机取代马云,会计从业取消 财务机器人上线 再不考下中级会计职称真的要被淘汰了...

自从会计从业资格考试暂停之后&#xff0c;政策频频变动&#xff0c;会计行业可谓风起云涌。紧接着&#xff0c;事务所推出财务机器人&#xff0c;马云无人超市开始运行&#xff0c;也是让财会人感到危机起伏。 这不&#xff0c;近日财会界又有两个大事件。一是会计从业考试取消…

sqli-lab代码审计

导入Seay并自动审计&#xff0c;一个一个进行查看 第一个&#xff1a; 这是一个文件写入的代码段&#xff0c;意思是将接收到的GET请求参数id的值拼接起来写入result.txt文件中&#xff0c;就是一个id的历史记录文件。因为没有对id参数进行过滤&#xff0c;所以认为有文件写入…

WAF原理及绕过(成功绕过某狗)

绕过截图 测试网站sqli-labs/Less-11&#xff0c;hackbar被拦截&#xff0c;burp成功绕过报错 原理解析 参考链接&#xff1a; https://blog.csdn.net/qq_36119192/article/details/90113167 https://www.freebuf.com/news/193659.html WAF绕过大致可分为三类&#xff1a;…

探寻宝藏-双进程DP(优化版)

题目 传说HMH大沙漠中有一个M*N迷宫&#xff0c;里面藏有许多宝物。某天&#xff0c;Dr.Kong找到了迷宫的地图&#xff0c;他发现迷宫内处处有宝物&#xff0c;最珍贵的宝物就藏在右下角&#xff0c;迷宫的进出口在左上角。当然&#xff0c;迷宫中的通路不是平坦的&#xff0c…