sicily1001. 输入输出LL(1)语法分析程序 **
来源:互联网 发布:ubuntu双系统安装 编辑:程序博客网 时间:2024/06/05 14:56
sicily1001. 输入输出LL(1)语法分析程序 **
题目:
Description
输入开始符号,非终结符,终结符,产生式,LL(1)分析表
输出LL(1)分析表
Input
输入开始符号;
非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号,空格符分隔;
LL(1)分析表中的产生式个数,序号,行符号,列符号,产生式编号,空格符分隔;
输入一个算术式符号串,用#结束
Output
输出推导过程,每一步一行,中间“ & ”前是已经识别的子串,后是栈中信息。
Sample Input
E6 E A T B F D9 + - * / ( ) x y z 131 E TA2 A +TA3 A -TA4 A k5 T FB6 B *FB7 B /FB8 B k9 F (E)10 F D11 D x12 D y13 D z251 E ( 12 E x 13 E y 14 E z 15 A + 26 A - 37 A ) 48 A # 49 T ( 510 T x 511 T y 512 T z 513 B + 814 B - 815 B * 616 B / 717 B ) 818 B # 819 F ( 920 F x 1021 F y 1022 F z 1023 D x 1124 D y 1225 D z 13(x+(y-x*z)*(y+x*z))+x/z#
Sample Output
# & E## & TA## & FBA## & (E)BA##( & E)BA##( & TA)BA##( & FBA)BA##( & DBA)BA##( & xBA)BA##(x & BA)BA##(x & A)BA##(x & +TA)BA##(x+ & TA)BA##(x+ & FBA)BA##(x+ & (E)BA)BA##(x+( & E)BA)BA##(x+( & TA)BA)BA##(x+( & FBA)BA)BA##(x+( & DBA)BA)BA##(x+( & yBA)BA)BA##(x+(y & BA)BA)BA##(x+(y & A)BA)BA##(x+(y & -TA)BA)BA##(x+(y- & TA)BA)BA##(x+(y- & FBA)BA)BA##(x+(y- & DBA)BA)BA##(x+(y- & xBA)BA)BA##(x+(y-x & BA)BA)BA##(x+(y-x & *FBA)BA)BA##(x+(y-x* & FBA)BA)BA##(x+(y-x* & DBA)BA)BA##(x+(y-x* & zBA)BA)BA##(x+(y-x*z & BA)BA)BA##(x+(y-x*z & A)BA)BA##(x+(y-x*z & )BA)BA##(x+(y-x*z) & BA)BA##(x+(y-x*z) & *FBA)BA##(x+(y-x*z)* & FBA)BA##(x+(y-x*z)* & (E)BA)BA##(x+(y-x*z)*( & E)BA)BA##(x+(y-x*z)*( & TA)BA)BA##(x+(y-x*z)*( & FBA)BA)BA##(x+(y-x*z)*( & DBA)BA)BA##(x+(y-x*z)*( & yBA)BA)BA##(x+(y-x*z)*(y & BA)BA)BA##(x+(y-x*z)*(y & A)BA)BA##(x+(y-x*z)*(y & +TA)BA)BA##(x+(y-x*z)*(y+ & TA)BA)BA##(x+(y-x*z)*(y+ & FBA)BA)BA##(x+(y-x*z)*(y+ & DBA)BA)BA##(x+(y-x*z)*(y+ & xBA)BA)BA##(x+(y-x*z)*(y+x & BA)BA)BA##(x+(y-x*z)*(y+x & *FBA)BA)BA##(x+(y-x*z)*(y+x* & FBA)BA)BA##(x+(y-x*z)*(y+x* & DBA)BA)BA##(x+(y-x*z)*(y+x* & zBA)BA)BA##(x+(y-x*z)*(y+x*z & BA)BA)BA##(x+(y-x*z)*(y+x*z & A)BA)BA##(x+(y-x*z)*(y+x*z & )BA)BA##(x+(y-x*z)*(y+x*z) & BA)BA##(x+(y-x*z)*(y+x*z) & A)BA##(x+(y-x*z)*(y+x*z) & )BA##(x+(y-x*z)*(y+x*z)) & BA##(x+(y-x*z)*(y+x*z)) & A##(x+(y-x*z)*(y+x*z)) & +TA##(x+(y-x*z)*(y+x*z))+ & TA##(x+(y-x*z)*(y+x*z))+ & FBA##(x+(y-x*z)*(y+x*z))+ & DBA##(x+(y-x*z)*(y+x*z))+ & xBA##(x+(y-x*z)*(y+x*z))+x & BA##(x+(y-x*z)*(y+x*z))+x & /FBA##(x+(y-x*z)*(y+x*z))+x/ & FBA##(x+(y-x*z)*(y+x*z))+x/ & DBA##(x+(y-x*z)*(y+x*z))+x/ & zBA##(x+(y-x*z)*(y+x*z))+x/z & BA##(x+(y-x*z)*(y+x*z))+x/z & A##(x+(y-x*z)*(y+x*z))+x/z & #
代码:
#include <cstring>#include <string.h>#include <iostream>#include <iomanip>#include <vector>#include <stack>using namespace std;struct v { char vn; string vt; //v(string vn1, string vt1) {vn = vn1, vt = vt1;}};struct sel { char v, t; int ch;};vector<char> s1,s2; //s1非终结符, s2终结符vector<v> s3;vector<sel> s4;string result;stack<char> room;string find(char v, char t) { for (auto i : s4) { if (i.v == v&&i.t == t) return s3[i.ch-1].vt; } return "";}bool in_v(char v) { for (auto i : s1) { if (i == v) return true; } return false;}bool in_t(char t) { for (auto i : s2) { if (i == t) return true; } return false;}int main() { char start; cin >> start; int s1num, s2num, s3num,s4num; cin >> s1num; for (int i = 0; i < s1num; i++) { char tmp; cin >> tmp; s1.push_back(tmp); } cin >> s2num; for (int i = 1; i <= s2num; i++) { char tmp; cin >> tmp; s2.push_back(tmp); } s2num++; s2.push_back('#'); cin >> s3num; for (int i = 1; i <= s3num; i++) { char vn; string vt; int n; cin >> n; cin >> vn; cin >> vt; v tmp; tmp.vn = vn, tmp.vt = vt; s3.push_back(tmp); } cin >> s4num; for (int i = 1; i <= s4num; i++) { char v, t; int num, n; cin >> n,cin >> v >> t, cin >> num; sel tmp; tmp.v = v, tmp.t = t, tmp.ch = num; s4.push_back(tmp); } cin >> result; room.push('#'); room.push(start); int tag = 0; while (1) { stack<char> tmp = room; cout << "#"; for (int i = 0; i < tag; ++i) { cout << result[i]; } cout << " & "; while (!tmp.empty()) { cout << tmp.top(); tmp.pop(); } cout << endl; if (in_v(room.top())) { string k = find(room.top(), result[tag]); room.pop(); for (int i = k.size() - 1; i >= 0; i--) { if (k[i] == 'k') continue; room.push(k[i]); } } else if (room.top() == '#') break; else { tag++; room.pop(); } } return 0;}
阅读全文
0 0
- sicily1001. 输入输出LL(1)语法分析程序 **
- 输入输出LL(1)语法分析程序
- 1000-输入输出LL(1)语法分析程序
- sicily1000. 输入输出LL(1)语法分析程序
- LL(1)语法分析程序
- 编译原理丨第十三周 ——1000. 输入输出LL(1)语法分析程序
- LL(1)语法分析
- LL(1)语法分析
- LL(1)语法分析
- C++:基于LL(1)方法的语法分析程序-1
- 一个基于LL(1)文法的语法分析程序
- C++:基于LL(1)方法的语法分析程序-2
- C++:基于LL(1)方法的语法分析程序-3
- 用JAVA实现LL(1)文法语法分析程序
- 自上而下语法分析LL(1)
- LL(1)语法分析实验报告
- LL(1)语法分析<转>
- LL(1)语法分析(java)
- 系统运维相关索引
- Dev如何调试
- 面向对象写的一个评价加星
- 事务的几种并发问题
- 《正太哲学》-正态分布的哲学本质及世界观意义
- sicily1001. 输入输出LL(1)语法分析程序 **
- java 日期加减天数、月数、年数的计算方式
- dropload.js中条件查询时,刷新样式增多问题。
- Javascript知识总结
- eclipse不自动弹出提示(alt+/快捷键失效)
- Java泛型
- JSON对象反序列化为Java对象的时候自定义Date类型的字符串格式
- 动态链接库是什么?怎么用?
- gcc版本和运行环境gdb版本不匹配所引发的调试问题