在語法分析過程中一般有兩種語法分析方法,自頂向下和自底向上,遞迴下降分析和ll(1)都屬於是自頂向下的語法分析自頂向下分析法的過程就像從第乙個非終結符作為根節點開始根據產生式進行樹的構建
s -> ab
a -> cb | c
b -> f
c -> de
對輸入字串debf的分析過程
s -> cbb -> debf
s -> cf x
整個過程就是對通過非終結符的不斷替換,所以當我們從左往右匹配這個句子的時候,需要找到合適的產生式,所以在自頂向下語法分析過程中作出正確的推導有兩種方法,一是遞迴下降,二是表驅動的語法分析,也就是ll(1)
對於遞迴下降分析,每個非終結符都有乙個對應的函式,程式從開始符號的對應函式開始執行,如果程式成功掃瞄了整個輸入字串,就代表語法分析成功
在呼叫非終結符對應的函式時就會遇見兩種情況:
void a() else if(is equal to the token) else
}}
但是非終結符的產生式不一定只有乙個,所以就產生了選擇問題,就需要回溯
else
ll(1)演算法屬於自頂向下的分析演算法,它的定義為:從左(l)向右讀入乙個符號,最左(l)推導,採用乙個1前看符號。ll(1)演算法和自頂向下分析演算法本質上是一致的,它們的區別就在於ll(1)演算法使用了一種稱為分析表的工具來避免了回溯操作。分析表的大概結構
/輸入字元
terminator
terminator
eofnon-terminal02
-non-terminal13
4即根據當前的非終結符和輸入字元可以**之後的產生式,以此來避免回溯
ll(1)的大概工作流程就是
要構建**分析表就需要根據產生式來生成三個集合,firset set, fllow set, select set先明白乙個概念,如果乙個非終結符,它可以推導出空集,那麼這樣的非終結符我們稱之為nullable的非終結符對乙個給定的非終結符,通過一系列語法推導後,能出現在推導表示式最左端的所有終結符的集合,統稱為該非終結符的first set。對於某個非終結符通過一系列推導變換後,某個終結符出現在該非終結符的後面,那麼我們稱該終結符屬於對應非終結符的follow setpublic void buildfollowsets()
printallfollowset();
system.out.println("***********************");}}
private void addsymbolfollowset(symbols symbol)
for (int i = 0; i < symbol.productions.size(); i++)
for (int k = j + 1; k < rightsize.length; k++) }}
int pos = rightsize.length - 1;
while (pos >= 0)
if (isterminalsymbol(current.value) && !current.isnullable)
pos--;}}
}
對於標號為n的推導表示式s -> a, 以及當前輸入t, 那麼select(n)要包含t的話,必須是,當棧頂元素是s, 且輸入為t時,要使用推導表示式n來進行下一步推導。private void buildselectionset()
}private void addsymbolselectionset(symbols symbol)
boolean isnullableproduction = true;
for (int i = 0; i < symbol.productions.size(); i++)
addsettoselectionset(selection, next.firstset);
}if (isnullableproduction)
symbol.selectionset.add(selection);
isnullableproduction = true;}}
private void setparsettable()
for (int i = 0; i < symbol.selectionset.size(); i++)
productioncount++;}}
}
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.語法分析的地位 是編譯程式的核心部分 2.語法分析的任務 識別由詞法分析得出的單詞序列是否是給定文法的句子 3.語法分析的理論基礎 上下文無關文法和下推自動機 4.語法分析的方式 1 自上而下語法分析 反覆使用不同產生式進行推導以謀求與輸入符號串相匹配 2 自下而上語法分析 對輸入符號串尋找不同...