1. 程式人生 > 其它 >Spring入門學習---03

Spring入門學習---03

目錄

1. 自頂向下分析(Top-Down Parsing)

  • 從分析樹的頂部(根節點)向底部(葉節點)方向構造分析樹

  • 可以看成是從文法開始符號S推導出詞串w的過程

  • 每一步推導中,都需要做兩個選擇

    • 替換當前句型中的哪個非終結符
    • 用該非終結符的哪個候選式進行替換

最左推導(Left-most Derivation)

自頂向下的語法分析採用最左推導方式.

最右推導(Right-most Derivation)

最左推導和最右推導的唯一性

自頂向下語法分析的通用形式

預測分析(Predictive Parsing)

1.1. 文法轉換

問題1---回溯

問題2---左遞迴導致無限迴圈

消除直接左遞迴

消除直接左遞迴的一般形式

消除間接左遞迴

合併產生式, 將間接左遞迴變成直接左遞迴再消除

消除左遞迴演算法

在每個終結符的迴圈內:

  • 先將所有比該終結符小的(標號小)終結符替換為產生式
  • 然後消除改終結符產生式之間的立即左遞迴

提取左公因子(Left Factoring)

推遲進入候選式的選擇, 減少回溯長度

提取左公因式演算法

1.2. LL(1)文法

S_文法

如果S_文法包含ε產生式,那麼它就成為了LL文法

非終結符的後繼符號集(FOLLOW)

產生式的可選集(SELECT)

串首終結符集(FIRST)

LL(1)文法概念

FIRST集計算

演算法:

計算串X1X2…Xn的FIRST集合:

FOLLOW集計算

SELECT集計算

預測分析表

1.3. LL(1)文法的分析方法

遞迴的預測分析法

非遞迴的預測分析法(表驅動)

遞迴的預測分析法vs.非遞迴的預測分析法

預測分析法實現步驟

預測分析法中的錯誤檢測

預測分析法中的錯誤恢復

2. 自底向上分析: 移入規約分析(Shift-Reduce Parsing)

移入-歸約分析的工作過程

移入-歸約分析器可採取的4中動作

移入-歸約分析中存在的問題

控制代碼: 句型的最左直接短語


(句型的)短語

2.1. LR分析法

LR分析法的基本原理

LR分析器(自動機)的總體結構

LR分析表的結構 及 分析過程

LR分析器的工作過程

LR分析演算法

如何構造給定文法的LR分析表

  • LR(0)分析
  • SLR分析
  • LR(1)分析
  • LALR分析

2.2. LR(0)分析

LR(0)專案

控制代碼? 含義? 直接短語?

增廣文法(Augmented Grammar)

LR(0)分析表的構造演算法

CLOSURE()函式

GOTO()函式

構造LR(0)自動機的狀態集

LR(0)分析表構造演算法

LR(0)自動機的形式化定義

LR(0)分析過程中的衝突

可能存在:

  • 移進 - 歸約 衝突

  • 歸約 - 歸約 衝突

  • 如果LR(0)分析表中沒有語法分析動作衝突,那麼給定的文法就稱為LR(0)文法
  • 不是所有CFG都能用LR(0)方法進行分析, 也就是說, CFG不總是LR(0)文法

2.3. SLR分析

S: simple
用FOLLOW集來判斷是歸約還是移入

  • 解決了一些 移入 - 歸約 衝突
  • 解決了 歸約 - 歸約 衝突 (每個產生式左部的FOLLOW集交集為∅)

LR分析的產生式滿足LL分析產生式的條件嗎??

SLR分析表構造演算法

SLR分析中的衝突

2.4. LR(1)分析

LR(1)的提出

規範LR(1)專案

等價LR(1)專案

賦值語句文法的LR(1)分析表

LR(1)專案集閉包

GOTO函式

為文法 G' 構造LR(1)項集族

LR(1)自動機的形式化定義

LR分析表構造演算法

2.5. LALR分析(lookahead-LR)

基本思想

合併同心項集

合併同心項集時產生 歸約-歸約衝突的例子

合併同心項集後, 雖然不產生衝突, 但可能會推遲錯誤的發現

LALR(1)的特點

2.6. 二義性文法的LR分析

二義性文法分析

二義性算術表示式文法的LR(0)分析器

二義性算術表示式文法的SLR分析表

二義性if語句文法的SLR分析表

**應該保守地使用二義性文法, 並且必須在嚴格控制之下使用, 英文稍有不慎就會導致語法分析器所識別的語言出現偏差. **

2.7. LR分析中的錯誤處理

恐慌模式錯誤恢復

短語層次錯誤恢復