Description

输入开始符号,非终结符,终结符,产生式
输出LR(k)优先分析过程
以拓广算术表达式G[A]: 为例
A→E
E→E+T | T
T→T*F | F
F→(E) | a

Input

非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号,空格符分隔;
状态数,ACTION列数,GOTO列数,空格符分隔;
状态,ACTION矩阵(k 0 表示空 A 0 表示接收),GOTO矩阵(0表示 空),空格符分隔;
输入分析字符串,#结束

Output

用“ & ”分隔,左边表示栈底到栈顶符号;右边表示尚未分析的字符串。

Sample InputCopy

A
4  E T F A
6  a +  * ( ) #
7
0  A E
1  E E+T
2  E T
3  T T*F
4  T F
5  F (E)
6  F a12 6 3
0  s 5  k 0  k 0  s 4  k 0  k 0  1 2 3
1  k 0  s 6  k 0  k 0  k 0  A 0  0 0 0
2  k 0  r 2  s 7  k 0  r 2  r 2  0 0 0
3  k 0  r 4  r 4  k 0  r 4  r 4  0 0 0
4  s 5  k 0  k 0  s 4  k 0  k 0  8 2 3
5  k 0  r 6  r 6  k 0  r 6  r 6  0 0 0
6  s 5  k 0  k 0  s 4  k 0  k 0  0 9 3
7  s 5  k 0  k 0  s 4  k 0  k 0  0 0 10
8  k 0  s 6  k 0  k 0  s 11 k 0  0 0 0
9  k 0  r 1  s 7  k 0  r 1  r 1  0 0 0
10 k 0  r 3  r 3  k 0  r 3  r 3  0 0 0
11 k 0  r 5  r 5  k 0  r 5  r 5  0 0 0(a+a)*a#

Sample OutputCopy

#0 & (a+a)*a#
#0(4 & a+a)*a#
#0(4a5 & +a)*a#
#0(4F3 & +a)*a#
#0(4T2 & +a)*a#
#0(4E8 & +a)*a#
#0(4E8+6 & a)*a#
#0(4E8+6a5 & )*a#
#0(4E8+6F3 & )*a#
#0(4E8+6T9 & )*a#
#0(4E8 & )*a#
#0(4E8)11 & *a#
#0F3 & *a#
#0T2 & *a#
#0T2*7 & a#
#0T2*7a5 & #
#0T2*7F10 & #
#0T2 & #
#0E1 & # 

程序:

#include <iostream>
#include <map>
#include <string>
#include <string.h>
#include <iomanip>
#include <stack>
#include <cmath>
using namespace std;int myatoi(const char* p) {int length = strlen(p);int res = 0;for (int i = 0; i < strlen(p); i++) {res *= 10;res += (p[i] - '0');}return res;
}string reverseString(string s) {string res;for(int i = s.size() - 1; i >= 0; i--) res += s[i];return res;
}struct Production {int n;string left;string right;
};int main(){char S;cin >> S;int nonterminal_num;cin >> nonterminal_num;string nonterminal[nonterminal_num];map<string, int> mapping;for (int i = 0; i < nonterminal_num; i++) {cin >> nonterminal[i];}int terminal_num;cin >> terminal_num;string terminal[terminal_num];for (int i = 0; i < terminal_num; i++) {cin >> terminal[i];mapping.insert(make_pair(terminal[i],i));}for (int i = 0; i < nonterminal_num; i++)mapping.insert(make_pair(nonterminal[i], i + terminal_num));int production_num;cin >> production_num;Production production[production_num];for (int i = 0; i < production_num; i++) cin >> production[i].n >> production[i].left >> production[i].right;int row_size;cin >> row_size;int action_column_size;cin >> action_column_size;int goto_column_size;cin >> goto_column_size;string table[row_size][action_column_size + goto_column_size];int dummy;for (int i = 0; i < row_size; i++) {cin >> dummy;string front, back;for (int j = 0; j < action_column_size; j++) {cin >> front >> back;table[i][j] = front + back;}for (int j = action_column_size; j < action_column_size + goto_column_size; j++) {cin >> table[i][j];}} string str;cin >> str;stack<string> stk;int cursor = 0;stk.push("#");stk.push("0");cout << "#0 & " << str << endl;while (true) {int row = myatoi(stk.top().c_str());char *p = new char;strncpy(p, &str[cursor], 1);p[1]='\0';string col = p;int column = mapping[col];delete p;string res = table[row][column];bool flag=false;
a:      if(res[0] == 's') {char *p = new char;strncpy(p, &str[cursor], 1);p[1]='\0';string col = p;stk.push(col);cursor++;delete p;stk.push(res.substr(1, res.size() - 1));}else if (res[0] == 'r') {int pop_num = production[myatoi(res.substr(1,res.size()-1).data())].right.size() * 2;while(pop_num--)  stk.pop();int row = myatoi(stk.top().c_str());int column = mapping[production[myatoi(res.substr(1,res.size()-1).data())].left];stk.push(production[myatoi(res.substr(1,res.size()-1).data())].left);res = table[row][column];stk.push(res);flag = true;goto a;}else if (res[0] >= '0' && res[0] <= '9') {int row = myatoi(stk.top().c_str());char *p = new char;strncpy(p, &str[cursor], 1);p[1]='\0';string col = p;int column = mapping[col];res = table[row][column];}else if (res[0] == 'A') {break;}else break;stack<string> copy = stk;string reverse, out;while(!copy.empty()) {string alan;if (copy.top().size() > 1)alan = reverseString(copy.top());else alan = copy.top();reverse+=alan;copy.pop();}out=reverseString(reverse);cout << out << " & " << str.substr(cursor, str.size() - cursor) << endl ;}return 0;
}

编译原理实验Sicily--LR(K) 语法分析程序相关推荐

  1. 编译原理-实验四-LR(0)语法分析程序的设计

    一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...

  2. 编译原理-实验二-LL(1)语法分析程序的设计

    一.实验目的 了解LL(1)分析器的基本构成及用自顶向下的LL(1)方法对表达式进行语法分析的方法,掌握LL(1)语法分析程序的构造方法. 二.实验内容 根据LL(1)语法分析算法的基本思想,设计一个 ...

  3. 编译原理实验三 LR(1)分析法

    实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...

  4. 编译原理 实验三 LR(1)分析法 Java

    1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...

  5. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

  6. 编译原理实验2(1)——自上而下语法分析

    一.实验目的 1.为初等函数运算语言构造LL(1)语法分析器. 2.掌握LL(1)语法分析器的方法,加深对自上而下语法分析原理的理解. 3.掌握设计.编制并调试LL(1)语法分析程序的思想和方法. 二 ...

  7. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  8. 编译原理实验:自下而上的语法分析--(LR分析)

    LR分析(NCWU慎用) 1.实验要求 ⑴ 选择LR分析方法: ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作为分析对象,并且与所选语法分析方法要比较贴切. ⑶ 实验时间 ...

  9. 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)

    写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...

  10. 编译原理实验:自下而上的语法分析---(算符优先分析)

    ** 算符优先分析程序(NCWU慎用) ** 1.实验要求 ⑴ 选择算符优先分析方法: ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作为分析对象,并且与所选语法分析方法要 ...

最新文章

  1. 从新手到入门,如何进入协议分析的世界
  2. 均分纸牌pascal程序
  3. AI种番茄!腾讯xWUR智慧温室大赛预赛揭晓,农科院和三星等五队挺进决赛
  4. 2018-06-22 第四十七天 oracle
  5. ReflectionClass与Closure
  6. error LNK2001: unresolved external symbol public: __thiscall CNaDialog::CNaDialog(class CWnd *)
  7. spring step 1 : 什么是spring
  8. 六年之后再次执行[BLQS]战略
  9. java中字节码_Java字节码浅析(—)
  10. php 类static引用函数吗,php中在变量和函数前加static关键字之后的区别
  11. AngularJS缓存
  12. 11-Container With Most Water
  13. 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
  14. 面包板电源线怎么接_如何维修面包板电源
  15. 我的IT之路------来自黑马程序员
  16. 永恒之蓝(MS17-010)
  17. 服务器淘汰cpu组装的电脑,从服务器淘汰下来的至强cpu还可以用多久
  18. 哈希传递PTH、密钥传递PTT、票据传递PTK的实现和比较
  19. 如何在vue 中使用组件,以及组件通信的方式(父传子/子传父/兄弟传)
  20. arduino步进电机程序库_Arduino入门教程15(步进电机驱动库的使用):Arduino Uno R3+ULN2003+步进电机 使用Stepper驱动库,控制步进电机转动角度...

热门文章

  1. matlab计算边坡可靠度,基于最优化方法的边坡稳定可靠度计算分析
  2. 抖音是如何毁掉我们的?
  3. iphone 的屏幕像素
  4. 苹果手机技巧,如何查男朋友手机,查岗技能大曝光!
  5. 解密Qphone:腾讯很现实 聚焦非智能手机市场
  6. 声音识别入门经典模型实践-基于大数据训练CNN14网络实现食物咀嚼声音识别
  7. Go 语言中的 logger 和 zap 日志库
  8. 安装Autodesk Vault Professional 2014 Server (ADMS)
  9. Ubuntu安装Nvida显卡驱动
  10. 安装nvida-docker2