編譯原理 LL(1)語法分析器

2021-08-19 21:00:16 字數 2530 閱讀 1001

1.專案要求

文法要求:

(1)從檔案讀入,每條產生式占用一行

(2)文法為ll(1)文法

從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 ll(1)分析演算法判斷該符號串是否為該文法的句子。

2.實驗思路:

首先實現集合first(x)構造演算法和集合follow(a)構造演算法,再根據first和follow集合構造出**分析表,並對指定的句子列印出分析棧的分析過程,判斷是否為該文法的句子。

3.實驗原理

(1)first集的演算法思想

如果產生式右部第乙個字元為終結符,則將其計入左部first集

如果產生式右部第乙個字元為非終結符執行以下步驟

求該非終結符的first集

將該非終結符的非$first集計入左部的first集

若存在$,則將指向產生式的指標右移

若不存在$,則停止遍歷該產生式,進入下乙個產生式

若已經到達產生式的最右部的非終結符,則將$加入左部的first集

處理陣列中重複的first集中的終結符

(2)follow集的演算法思想

對於文法g中每個非終結符a構造follow(a)的辦法是,連續使用下面的規則,直到每個follow不在增大為止.

對於文法的開始符號s,置#於follow(s)中;

若a->abb是乙個產生式,則把first(b)\加至follow(b)中;

若a->ab是乙個產生式,或a->abb是乙個產生式而b=>ε(即ε∈first(b))則把follow(a)加至follow(b)中

(3)生成**分析表的演算法思想

構造分析表m的演算法是:

對文法g的每個產生式a->a執行第二步和第三步;

對每個終結符a∈first(a),把a->a加至m[a,a]中;

若ε∈first(a),則把任何b∈follow(a)把a->a加至m[a,b]中;

把所有無定義的m[a,a]標上出錯標誌.

(4)對符號串的分析過程

**分析程式的總控程式在任何時候都是按stack棧頂符號x和當前的輸入符號行事的,對於任何(x,a),總控程式

每次都執行下述三種可能的動作之一;

若x=a=」#」,則宣布分析成功,停止分析過程.

若x=a≠」#」,則把x從stack棧頂逐出,讓a指向下乙個輸入符號.

若x是乙個非終結符,則檢視分析表m,若m[a,a]中存放著關於x的乙個產生式,那麼,首先把x逐出stack棧頂,然後把產生式的右部符號串按反序一一推進stack棧(若右部符號為ε,則意味著不推什麼東西進棧).在把產生式的右部符號推進棧的同時應做這個產生式相應得語義動作,若m[a,a]中存放著」出錯標誌」,則呼叫出錯診察程式error.

4.實驗**

#include#include#include#include#include#include#includeusing namespace std;

mapgetnum;

char getchar[100]; //獲得對應字元

vectorproce;

int table[100][100]; //**分析表

int num=0;int numvt=0; //numvt是終結符集合,0是『#』,numvt表空字

string first[100];

string follow[200];

void readin()

while(cin.peek()!='\n');

numvt=++num;

getnum['@']=numvt; //kong zi

getchar[num]=('@');

cout

getnum[x]=++num;

getchar[num]=x;

}while(cin.peek()!='\n');

cout

string get_f(int vn,int & has_0) //dfs:vn能推出的不含空字的vt集合,並且判斷vn能否推出空字

else if(cur=='#') //成功,結束

else if(table[getnum[cur]][getnum[word[i]]]!=-1) //查表

}else //失敗!

編譯原理 LL 1 語法分析

直接輸入根據已知文法構造的分析表m,對於輸入的文法和符號串,所編制的語法分析程式應能正確判斷此串是否為文法的句子,並要求輸出分析過程。c 實現如下 includeusing namespace std const int l num 100000 const int max 100 分析表容量 co...

LL 1 語法分析器 c 實現

測試樣例 ll1,類ll1繼承了base,用於生成 表和分析輸入語句.記號和規定 ifndef base h define base h include include include include include define maxsize 100 using namespace std st...

LL(1)語法分析

ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...