编译原理c++基于LR分析表编写语法分析器
具体要求
已知文法G[E]:
E->E+T | T
T->(E) | id | id[E] //其中E,T为非终结符,其余符号为终结符
(1)为该文法建立LR分析表。//通过构造项目集规范族完成识别可归前缀的DFA。
(2)根据测试样例及你建立的LR分析表,用c++完成语法分析器的设计。
测试样例
要求格式完全一致,第一行为输入,第二行为要求的输出,共四组样例。
a1 + a2
Syntax analysis is right
a1 + (a2)
Syntax analysis is right
a1++a2
Error on syntax analysis
a1[a2 + a3] + a4 + a5
Syntax analysis is right
a1 + a2[a3] + a4 + (a5 + a6)
Syntax analysis is right
PS
1.代码仅考虑了变量为a0-a9的情况,如有变化,需要进行修改。
2.代码在本机测试时完全正确,在上传在线平台验证时报错,信息如下:
具体原因未知,怀疑是数组或栈的问题,在解决后更新。。。
运行时错误(SIGSEGV)
|
具体实现
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <stack>#include <cstring> #include <map>#define MAXNUM 1000using namespace std;int symbolNum;
string inputSymbol[MAXNUM];
stack<int> status;
stack<string> instr;
stack<string> symbol;int table1[12][7]={0,1,0,0,0,1,0,1,0,0,0,0,0,-1,2,0,2,0,2,0,2,2,0,2,0,2,1,2,2,0,2,1,2,0,2,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,2,0,2,0,2,0,2};
int table2[12][7]={0,3,0,0,0,4,0,5,0,0,0,0,0,0,2,0,2,0,2,0,2,4,0,4,0,4,4,4,4,0,4,6,4,0,4,0,3,0,0,0,4,0,0,3,0,0,0,4,0,5,0,10,0,0,0,0,5,0,0,0,11,0,0,1,0,1,0,1,0,1,3,0,3,0,3,0,3,5,0,5,0,5,0,5};;
int table3[12][2]={1,2,0,0,0,0,7,2,0,0,0,9,8,2,0,0,0,0,0,0,0,0,0,0};;map<string, string> infer;
map<string, int> infernum;
map<int, string> inferstr;void initial(){infer["E+T"] = "E";infer["T"] = "E";infer["(E)"] = "T";infer["id"] = "T";infer["id[E]"] = "T";infernum["E+T"] = 3;infernum["T"] = 1;infernum["(E)"] = 3;infernum["id"] = 1;infernum["id[E]"] = 4;inferstr[1]="E+T";inferstr[2]="T";inferstr[3]="(E)";inferstr[4]="id";inferstr[5]="id[E]";status.push(0);instr.push("#");symbol.push("#");for (int i=symbolNum-1; i>=0; i--) {symbol.push(inputSymbol[i]);}
}bool isnumber (char ch){if(ch>=48 && ch<=57){return 1;}return 0;
}int symboltoint(string ch){if(ch=="+")return 0;if(ch=="(")return 1; if(ch==")")return 2;if(ch=="[")return 3;if(ch=="]")return 4;if(ch=="id")return 5;if(ch=="#")return 6;
}int instrtoint(string ch){if(ch=="E")return 0;if(ch=="T")return 1;
}void grammerAnalysis(){int action,change,number;while(true){action=table1[status.top()][symboltoint(symbol.top())];//1,2change=table2[status.top()][symboltoint(symbol.top())];//4,2//action:S,移进if(action==1){instr.push(symbol.top());symbol.pop();status.push(change);}//action:r,规约 else if(action==2){string n=inferstr[change];for(int i=0;i<infernum[n];i++){status.pop();instr.pop();}instr.push(infer[n]);number=table3[status.top()][instrtoint(instr.top())];//2status.push(number);}//accelse if(action==-1){cout<<"Syntax analysis is right";break;}//action=0else{cout<<"Error on syntax analysis";break;}
}
}int main(){//输入句子char x,y;string a;do{scanf("%c",&x);if(x==' '){continue;}else if(x=='a') {scanf("%c",&y);if(isnumber(y)){a="id";inputSymbol[symbolNum++]=a;}else{continue;} }else if(x=='\n'){break;}else{inputSymbol[symbolNum++]=x;};}while(x!='\n');if(symbolNum==0){cout<<"Error on syntax analysis";}else{//栈初始化 initial(); //语法分析 grammerAnalysis();}return 0;
}
12月19日更新:
不容易,花了好几个小时终于过了。
报错原因:系统中,scanf函数不接受换行符‘\n’
解决办法:用getline函数直接获取一整行字符串的输入,再把字符串的每一个字符挨个放进字符数组里
代码如下:修改main函数中读取输入的部分
string input;char ch[1024];int number;getline(cin,input);for(int i=0;i<=input.length();i++){ch[number++]=input[i];}//cout<<ch<<endl<<number-1<<endl;for(int i=0;i<=number-2;i++){if(ch[i]==' '){continue;}else if(ch[i]=='a') { if(isnumber(ch[++i])){inputSymbol[symbolNum++]="id";}else{continue;}}else{inputSymbol[symbolNum++]=ch[i];//cout<<input[i];};}
编译原理c++基于LR分析表编写语法分析器相关推荐
- 编译原理语法分析之LR分析
要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...
- 编译原理:语法分析实验(LR分析法)
语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...
- 编译原理教程_6 LR分析法
文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 6. LR分析法 6.1 简介 (1)LR分析法的优缺点 (2)分析表的 ...
- 编译原理实验:Java实现SLR(1)语法分析器
首先如果有熟悉Python的童鞋也可以看一看Python实现SLR(1)语法分析器,编译原理yyds!__FF_Y的博客-CSDN博客_python语法分析器,是我一个特别好的学长写的,这波属于传承了 ...
- 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现
下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...
- 编译原理实验五:用Yacc设计语法分析器1
所有实验的源代码:点此下载 实验目的: 学习如何使用Yacc设计一个语法分析器,并与用lex写的词法分析器链接起来. 实验内容: 使用yacc为实验2所给的语言写一个语法分析器(你可以重新设计该语言的 ...
- 《编译原理》实验预习报告——递归下降语法分析器的构建
一.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 二.实验预习提示 1.递归下降分析法的功能 词法分析器的功能是利用 ...
- 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...
- 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法
<编译原理-实验5-LR(1)分析法>由会员分享,可在线阅读,更多相关<编译原理-实验5-LR(1)分析法(6页珍藏版)>请在人人文库网上搜索. 1.编译原理实验报告项目名称 ...
最新文章
- scala逻辑运算符的一览图和代码案例
- 使用jenkins进行git多分支项目打包时的一个小问题
- 对于指针与malloc函数关系的研究,以及指针的赋值。
- sudo su su_Spring Security应用程序中的su和sudo
- webapi部署到IIS 404错误
- 宽度自适应实现方法(转)
- Jmeter性能测试的标准流程
- 用轻量服务器搭建自己的pdf在线工具箱(支持pdf压缩以及pdf OCR)
- python如何提交作业_python分析作业提交情况
- 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
- unity之跳一跳(完整版)
- HDMI 2.1特性
- stm32f103zet6 hello world
- 3·15曝光丨智能机器人一年拨打40亿个骚扰电话,6亿人信息已遭泄露!
- listview pyqt5 添加_PyQt学习随笔:ListView控件增加列表项
- 参考文献编号批量设置为上标
- 2019百度云智峰会重磅发布:全自研昆仑云服务器、智能来电小秘书
- iview的table合并相同的单元格
- 控制器 PM866K01/ABB\SD833
- JAVA程序设计:数组中的最长山脉(LeetCode:845)