直接輸入根據已知文法構造的分析表m,對於輸入的文法和符號串,所編制的語法分析程式應能正確判斷此串是否為文法的句子,並要求輸出分析過程。
c++實現如下:
#includeusing namespace std;
const int l_num=100000;
const int max=100; //**分析表容量
const string error="出錯! 該文法無法識別該語言!";
string str[max][max]; //**分析表
int gone=0; //代表步驟
char any[max]; //分析棧
int top=-1; //分析棧指標
queues; //儲存輸入串的佇列
int n; //非終結符個數
int t; //終結符個數
maprow; //分析表行號對映
mapcol; //分析表列號對映
map::iterator rit; //訪問行對映的迭代器
map::iterator cit; //訪問列對映的迭代器
void terror(); //出錯處理
void anysit(); //語法分析
void inputx(); //輸入函式
void outputx(); //輸出函式
char c0; //儲存開始符號
char c; //暫存終結符或非終結符
string s0; //暫存產生式/輸入串
int main()
void terror()
} cout<
for(int i=0;i>c;
col[c]=i+1;
} cout
str[i][j]=s0;
} }
cout<
cin>>s0;
for(int i=0;i'z')&&any[top]!=s.front())
else if(any[top]>='a'&&any[top]<='z')
}for(cit=col.begin();cit!=col.end();cit++)
}if(y==l_num||str[x][y]=="@")
else
}coutta @ @
@ ->+ta @ @ ->$ ->$
->fb @ @ ->fb @ @
@ ->$ ->*fb @ ->$ ->$
->i @ @ ->(e) @ @
*/
以上面的**分析表進行語法分析執行結果:
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.專案要求 文法要求 1 從檔案讀入,每條產生式占用一行 2 文法為ll 1 文法 從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 ll 1 分析演算法判斷該符號串是否為該文法的句子。2.實驗思路 首先實現集合first x 構造演算法和集合follow a 構造演算法,再根據first和fo...