sicily1001. 输入输出LL(1)语法分析程序 **
题目:
Description
输入开始符号,非终结符,终结符,产生式,LL(1)分析表
输出LL(1)分析表
Input
输入开始符号;
非终结符个数,非终结符,空格符分隔;
终结符个数,终结符,空格符分隔;
产生式的个数,各产生式的序号,产生式的左边和右边符号,空格符分隔;
LL(1)分析表中的产生式个数,序号,行符号,列符号,产生式编号,空格符分隔;
输入一个算术式符号串,用#结束
Output
输出推导过程,每一步一行,中间“ & ”前是已经识别的子串,后是栈中信息。
Sample Input
E 6 E A T B F D 9 + - * / ( ) x y z 13 1 E TA 2 A +TA 3 A -TA 4 A k 5 T FB 6 B *FB 7 B /FB 8 B k 9 F (E) 10 F D 11 D x 12 D y 13 D z 25 1 E ( 1 2 E x 1 3 E y 1 4 E z 1 5 A + 2 6 A - 3 7 A ) 4 8 A # 4 9 T ( 5 10 T x 5 11 T y 5 12 T z 5 13 B + 8 14 B - 8 15 B * 6 16 B / 7 17 B ) 8 18 B # 8 19 F ( 9 20 F x 10 21 F y 10 22 F z 10 23 D x 11 24 D y 12 25 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;
}