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

廢話不多說了,開源代碼!歡迎star和fork!
LL(1)語法分析器的實現

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
要實現LL1文法,根據個人經驗總結,需要以下步驟:
在這裏插入圖片描述
我沒有實現間接左遞歸的消除,所以處理不了間接左遞歸文法。

下面我們來說一下實現過程。
輸入相關文法,使用正則表達式將文法中的空串做了清除。
對文法消除直接左遞歸,使用以下方法:
要是檢測到一條文法中出現以下情況:
P->Pa|b
則這條文法就是左遞歸文法,我們可以將其改寫成以下非直接左遞歸形式:
P->bX
X->aX|e
e是空串

下面是根據消除了左遞歸的文法,找所有非終結符號的first集合和follow集合

我們再來回顧一下first集合的求法:

文法G的任何符號串a=X1X2X3…Xn構造集合first(a)。
首先,置first(a) = first(X1)/e(e爲空串);
若對任何1<=j<=i-1,e屬於first(Xj),就把first(Xj)中e以外的元素加到first(a)中;
若所有first(Xj)均含有e,1<=j<=n,則將e加至first(a)中;

以上描述轉化成流程圖:
在這裏插入圖片描述

下面求follow集合:

對於文法的開始符號S,置#到follow中;
若A->aBb是一個產生式,則將first(B)/e加到follow(B)中;
若A->aB是一個產生式,或者A->aBb是一個產生式,而b的first集合中包含空串,則將follow(A)加到follow(B)中

轉化成流程圖:
在這裏插入圖片描述
輸入表達式測試,是一個在一定時機出棧進棧的過程。這個比較簡單,就不說了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章