description
輸入開始符號,非終結符,終結符,產生式,ll(1)分析表
輸出ll(1)分析表
此題需要提交實驗報告;「實驗報告用「學號+姓名+72」
input
輸入開始符號;
非終結符個數,非終結符,空格符分隔;
終結符個數,終結符,空格符分隔;
產生式的個數,各產生式的序號,產生式的左邊和右邊符號,空格符分隔;
ll(1)分析表中的產生式個數,序號,行符號,列符號,產生式編號,空格符分隔;
輸入乙個算術式符號串,用#結束
output
輸出推導過程,每一步一行,中間「 & 」前是已經識別的子串,後是棧中資訊。
sample input
e
6 e a t b f d
9 + - * / ( ) x y z
131 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
251 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 & #
本程式主要有由三個模組組成
模組一功能:輸入資料
模組二功能:
生成ll分析表
模組三功能:
執行總控演算法
code:
#include #include #include using namespace std;
bool findvt(const std::vector&vt, char ch)
cin >> int_helper;
for(int i=0;i> char_helper;
vt.push_back(char_helper);
} vt.push_back('#');
cin >> int_helper;
for(int i=0;i> temp;
cin >> char_helper;
pl.push_back(char_helper);
string string_helper;
cin >> string_helper;
pr.push_back(string_helper); }
// complete the table
std::vectorvector_helper(vt.size(),"");
std::vector> table;
for(int i=0;i> int_helper;
for(int i=0;i> temp;
char ch1;
char ch2;
int index, row, col;
cin >> ch1 >> ch2 >> index;
for(int i=0;i> equation;
string s;
string visited;
int ptr = 0;
s.push_back(start[0]);
cout << "# & e#" << endl;
while(equation[ptr] != '#')
else
}for(int i=0;i}
string temp = table[row][col];
if(temp != "k")
s = temp + s;
} cout << "#" << visited << " & " << s << "#" << endl;
} while(s.size())
return 0;
}
LL(1)語法分析
ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...
LL 1 語法分析
ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...
自上而下語法分析LL(1)
1.語法分析的地位 是編譯程式的核心部分 2.語法分析的任務 識別由詞法分析得出的單詞序列是否是給定文法的句子 3.語法分析的理論基礎 上下文無關文法和下推自動機 4.語法分析的方式 1 自上而下語法分析 反覆使用不同產生式進行推導以謀求與輸入符號串相匹配 2 自下而上語法分析 對輸入符號串尋找不同...