编译原理实验Sicily--LR(K) 语法分析程序
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) 语法分析程序相关推荐
- 编译原理-实验四-LR(0)语法分析程序的设计
一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...
- 编译原理-实验二-LL(1)语法分析程序的设计
一.实验目的 了解LL(1)分析器的基本构成及用自顶向下的LL(1)方法对表达式进行语法分析的方法,掌握LL(1)语法分析程序的构造方法. 二.实验内容 根据LL(1)语法分析算法的基本思想,设计一个 ...
- 编译原理实验三 LR(1)分析法
实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...
- 编译原理 实验三 LR(1)分析法 Java
1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...
- 编译原理—实验二LL(1)语法分析(一)
一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...
- 编译原理实验2(1)——自上而下语法分析
一.实验目的 1.为初等函数运算语言构造LL(1)语法分析器. 2.掌握LL(1)语法分析器的方法,加深对自上而下语法分析原理的理解. 3.掌握设计.编制并调试LL(1)语法分析程序的思想和方法. 二 ...
- 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)
实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求 根 ...
- 编译原理实验:自下而上的语法分析--(LR分析)
LR分析(NCWU慎用) 1.实验要求 ⑴ 选择LR分析方法: ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作为分析对象,并且与所选语法分析方法要比较贴切. ⑶ 实验时间 ...
- 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)
写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...
- 编译原理实验:自下而上的语法分析---(算符优先分析)
** 算符优先分析程序(NCWU慎用) ** 1.实验要求 ⑴ 选择算符优先分析方法: ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句或表达式或控制流语句等作为分析对象,并且与所选语法分析方法要 ...
最新文章
- 从新手到入门,如何进入协议分析的世界
- 均分纸牌pascal程序
- AI种番茄!腾讯xWUR智慧温室大赛预赛揭晓,农科院和三星等五队挺进决赛
- 2018-06-22 第四十七天 oracle
- ReflectionClass与Closure
- error LNK2001: unresolved external symbol public: __thiscall CNaDialog::CNaDialog(class CWnd *)
- spring step 1 : 什么是spring
- 六年之后再次执行[BLQS]战略
- java中字节码_Java字节码浅析(—)
- php 类static引用函数吗,php中在变量和函数前加static关键字之后的区别
- AngularJS缓存
- 11-Container With Most Water
- 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
- 面包板电源线怎么接_如何维修面包板电源
- 我的IT之路------来自黑马程序员
- 永恒之蓝(MS17-010)
- 服务器淘汰cpu组装的电脑,从服务器淘汰下来的至强cpu还可以用多久
- 哈希传递PTH、密钥传递PTT、票据传递PTK的实现和比较
- 如何在vue 中使用组件,以及组件通信的方式(父传子/子传父/兄弟传)
- arduino步进电机程序库_Arduino入门教程15(步进电机驱动库的使用):Arduino Uno R3+ULN2003+步进电机 使用Stepper驱动库,控制步进电机转动角度...