轉載自http://bbs.csdn.NET/topics/340142238
自上而下與自下而上:
1.首先LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。
2.自上而下?從開始符號出發,根據產生式規則推導給定的句子。
3.自下而上?從給定的句子規約到文法的開始符號。
4.自上而下就是一種試探過程,怎么試探?需要你寫出它的FIRST()集與FOLLOW()集(不會寫了自己查書上網搜)。寫出這兩個集合后根據LL(1)分析表構造規則畫出LL(1)分析表。現在基本完成了大半,當計算機輸入句子時,分析程序便會根據輸入去和分析表進行匹配,如果每步都能夠匹配成功則說明符合該語法規則,分析成功。FIRST()集?其實是終結符的集合,看該非終結符A能不能產生以它里面的某個符號開頭的句子。(這也是自上而下分析法的思想)
5.自下而上就是把句子變成非終結符,在把非終結符變成非終結符,這樣不斷的進行如果能到根節點則成功。
判斷LL(1)SLR(1)LR(1)LALR(1):
6.LL(1)就是向前只搜索1個符號,即與FIRST()匹配,如果FIRST為空則還要考慮FELLOW。
7.LR需要構造一張LR分析表,此表用於當面臨輸入字符時,將它移進,規約(即自下而上分析思想),接受還是出錯。
8.LR(0)找出句柄前綴,構造分析表,然后根據輸入符號進行規約。
9.SLR(1)使用LR(0)時若有沖突,不知道規約,移進,活移進哪一個,所以需要向前搜索,則只把有問題的地方向前搜索一次。
10.LR(1) 在每個項目中增加搜索符;舉個列子如有A->α.Bβ,則還需將B的規則也加入。
11.LALR(1)就是假如兩個產生式集相同則將它們合並為一個,幾合並同心集。
12. 我認為LR(1),SLR(1),LALR(1)只是對LR(0)的一種更全面的分析與考慮,關鍵先把LR(0)搞懂。