編譯原理 實驗五 LL 1 語法分析(四)

2021-09-22 12:27:42 字數 1563 閱讀 5660

一、實驗目的

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 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...