一、實驗目的
1.熟悉ll(1)語法分析的基本原理,語法分析的過程,以及語法分析中要注意的一些問題。
2. 複習高階語言及線性表、棧、圖等典型資料結構,進一步加強用高階語言來解決實際問題的能力。
二、實驗內容
將實驗四編寫的程式的基礎之上,實現下面的功能:
按照教材5.2節演算法,輸入乙個符號串,根據實驗四的**分析表,輸出該符號串的最左推導,如果不能構造,提示字串的出錯位置。
s->a
s->^
s->(t)
t->sn
n->,sn
n->@
**如下:
#includeusing namespace std;
int main()
sentence.push_back('#');
// for(int i=0;i::iterator a = sentence.begin(), ii;
stacks;
vectorvet;
s.push('#');
s.push('s');//分析棧
vet.push_back('#');//儲存分析棧
vet.push_back('s');
cout << "分析棧" << " " << "剩餘輸入串" << " " << "推導所用的產生式或匹配" << endl;
int empty = 7;
string ac[51];
int k=0;
while (!s.empty())
for (int i = vet.size(); i <= empty+2; i++)
cout << " ";
int count = 0;
for (ii = a; ii != sentence.end(); ii++) //剩餘輸入串
for (; count <= empty; count++)
cout << " ";
char x = s.top();//棧頂符號 *a當前輸入符號
if (x == (*a))
}if (flag)break;}}
for (int i = 0; i <= empty; i++)cout << " ";
if (!flag)
cout << x << "->" << ss << endl;
ac[k++]=x+ss;//最左推導儲存
reverse(ss.begin(), ss.end()); //反轉
if (ss == "@")
else
}} }
cout << "最左推導數:" << endl;
cout<<"s=>"<";
string str1="";
for(int j=0; jelse
str1+=ac[i].substr(1);
}else
str1+=qq[j];
} qq=str1;
cout<}}
編譯原理 實驗四 LL 1 語法分析(三)
實驗四 ll 1 語法分析 三 2學時 一 實驗目的 1 熟悉ll 1 語法分析的基本原理,語法分析的過程,以及語法分析中要注意的一些問題。2.複習高階語言及線性表 棧 圖等典型資料結構,進一步加強用高階語言來解決實際問題的能力。二 實驗內容 將實驗三編寫的程式的基礎之上,實現下面的功能 按照教材5...
編譯原理 LL 1 語法分析
直接輸入根據已知文法構造的分析表m,對於輸入的文法和符號串,所編制的語法分析程式應能正確判斷此串是否為文法的句子,並要求輸出分析過程。c 實現如下 includeusing namespace std const int l num 100000 const int max 100 分析表容量 co...
LL(1)語法分析
ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...