具体要求

已知文法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)

错误原因可能是:
非法的内存引用, 具体原因可能是:
1.数组越界使用;
2.指针的错误使用, 一般是对非用户区的地址空间进行读或者写操作;
3.越权操作文件指针, 程序中却未捕捉该类错误;
4.栈溢出, 一般是因为过多的递归调用或者过大的临时变量导致;5.程序使用的内存超过了题目设定的上限。

具体实现

#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分析表编写语法分析器相关推荐

  1. 编译原理语法分析之LR分析

    要求: (1)根据给定文法,先对文法进行解析,构造识别活前缀的DFA并输出: (2)根据DFA构造LR分析表并输出: (3)分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程) (4) ...

  2. 编译原理:语法分析实验(LR分析法)

    语法分析实验 一.实验目的 根据LR分析法的原理,对指定文法构造识别活前缀的DFA,做出相应的LR分析表,并编程实现相应的语法分析程序.或根据预测分析法的原理,对指定文法构造预测分析表,并编程实现相应 ...

  3. 编译原理教程_6 LR分析法

    文章原稿 https://gitee.com/fakerlove/fundamentals-of-compiling 文章目录 6. LR分析法 6.1 简介 (1)LR分析法的优缺点 (2)分析表的 ...

  4. 编译原理实验:Java实现SLR(1)语法分析器

    首先如果有熟悉Python的童鞋也可以看一看Python实现SLR(1)语法分析器,编译原理yyds!__FF_Y的博客-CSDN博客_python语法分析器,是我一个特别好的学长写的,这波属于传承了 ...

  5. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  6. 编译原理实验五:用Yacc设计语法分析器1

    所有实验的源代码:点此下载 实验目的: 学习如何使用Yacc设计一个语法分析器,并与用lex写的词法分析器链接起来. 实验内容: 使用yacc为实验2所给的语言写一个语法分析器(你可以重新设计该语言的 ...

  7. 《编译原理》实验预习报告——递归下降语法分析器的构建

    一.实验目的 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对递归下降分析法的理解. 二.实验预习提示 1.递归下降分析法的功能 词法分析器的功能是利用 ...

  8. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

    05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...

  9. 编译实验 lr c语言代码,编译原理-实验5-LR(1)分析法

    <编译原理-实验5-LR(1)分析法>由会员分享,可在线阅读,更多相关<编译原理-实验5-LR(1)分析法(6页珍藏版)>请在人人文库网上搜索. 1.编译原理实验报告项目名称 ...

最新文章

  1. scala逻辑运算符的一览图和代码案例
  2. 使用jenkins进行git多分支项目打包时的一个小问题
  3. 对于指针与malloc函数关系的研究,以及指针的赋值。
  4. sudo su su_Spring Security应用程序中的su和sudo
  5. webapi部署到IIS 404错误
  6. 宽度自适应实现方法(转)
  7. Jmeter性能测试的标准流程
  8. 用轻量服务器搭建自己的pdf在线工具箱(支持pdf压缩以及pdf OCR)
  9. python如何提交作业_python分析作业提交情况
  10. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!
  11. unity之跳一跳(完整版)
  12. HDMI 2.1特性
  13. stm32f103zet6 hello world
  14. 3·15曝光丨智能机器人一年拨打40亿个骚扰电话,6亿人信息已遭泄露!
  15. listview pyqt5 添加_PyQt学习随笔:ListView控件增加列表项
  16. 参考文献编号批量设置为上标
  17. 2019百度云智峰会重磅发布:全自研昆仑云服务器、智能来电小秘书
  18. iview的table合并相同的单元格
  19. 控制器 PM866K01/ABB\SD833
  20. JAVA程序设计:数组中的最长山脉(LeetCode:845)

热门文章

  1. Linux这些年经历了什么?
  2. 学计算机装机,新手学装机:小白如何从零开始学装机
  3. VT处理器常用额外指令集(VMX)
  4. APS的定义是什么?高级计划与排程APS有哪些痛点?
  5. 使用 GOLANG 发送邮件
  6. 记录解决nonebot2中定时器报时区问题的错误
  7. 非日语专业如何有效学习日语?
  8. 测开学习篇-html
  9. 课程设计题十二:电子密码锁
  10. html设置首页到尾页的按钮,AspNetPager里面的按钮(如:首页,上一页 下一页,尾页)如何更换为我想要的图片...