語法分析


目錄

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

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

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

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

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

最左推導(Left-most Derivation)

image-20211108081848973

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

kgzty-93jyp

最右推導(Right-most Derivation)

image-20211108082156857

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

image-20211108082314852

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

image-20211108085141535

預測分析(Predictive Parsing)

image-20211108085239604

1.1. 文法轉換

問題1---回溯

image-20211108091851620

問題2---左遞歸導致無限循環

image-20211108092128945

消除直接左遞歸

image-20211108092356654

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

image-20211108092934888

消除間接左遞歸

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

image-20211108093737818

image-20211108155445163

消除左遞歸算法

image-20211108094203538

image-20211108094427718

在每個終結符的循環內:

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

提取左公因子(Left Factoring)

image-20211108100238359

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

提取左公因式算法

image-20211108100745382

1.2. LL(1)文法

S_文法

image-20211108143034121

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

image-20211108144838020

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

image-20211108144947876

串首終結符集(FIRST)

image-20211108145325535

產生式的可選集(SELECT)

image-20211108145147059

LL(1)文法概念

image-20211108145626218

FIRST集計算

image-20211108155545080

算法:

image-20211108155643719

計算串X1X2…Xn的FIRST集合:

image-20211108160202793

FOLLOW集計算

image-20211108151155079

image-20211109125458550

SELECT集計算

image-20211109125522546

預測分析表

image-20211109125552165

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

遞歸的預測分析法

image-20211108152107980

image-20211109125630686

image-20211108152536482

image-20211108153952952

image-20211108154246219

image-20211108154326000

image-20211108154353615

image-20211108154419176

image-20211108154455570

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

image-20211108154524114

image-20211109125132917

image-20211108154637463

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

image-20211108154732459

預測分析法實現步驟

image-20211108154811906

預測分析法中的錯誤檢測

image-20211108154837403

預測分析法中的錯誤恢復

image-20211108154901932

image-20211108155153425

image-20211108155110086

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

image-20211109081207970

image-20211109081916871

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

image-20211109082027055

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

image-20211109082131744

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

選用哪個產生式?

image-20211110102541105

句柄: 句型的最左直接短語

正確的應該是:

image-20211110102629941


(句型的)短語

短語, 直接短語, 句柄

image-20211109082845357

2.1. LR分析法

image-20211109082956563

LR分析法的基本原理

image-20211109083544103

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

image-20211109083635820

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

image-20211109084048031

image-20211109084115861

LR分析器的工作過程

image-20211109084424249

LR分析算法

image-20211109084537375

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

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

2.2. LR(0)分析

LR(0)項目

image-20211109084730514

image-20211109090338561

增廣文法(Augmented Grammar)

image-20211109090143006

image-20211109090507791

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

CLOSURE()函數

image-20211109090901858

GOTO()函數

image-20211109090926757

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

image-20211109091008437

LR(0)分析表構造算法

image-20211109091241912

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

image-20211109091434876

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

image-20211109091721501

可能存在:

  • 移進 - 歸約 沖突

  • 歸約 - 歸約 沖突

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

2.3. SLR分析

S: simple
移入優先, 用FOLLOW集來判斷是用哪個產生式歸約

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

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

image-20211109092218878

SLR條件

image-20211109092659701

image-20211109093224352

SLR分析表構造算法

image-20211109093250283

SLR分析中的沖突

image-20211109093428596

2.4. LR(1)分析

LR(1)的提出

image-20211109095321744

規范LR(1)項目

image-20211109095629858

等價LR(1)項目

image-20211109100144406

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

image-20211109100527026

image-20211109100615210

image-20211109101035890

LR(1)項目集閉包

image-20211109101147958

GOTO函數

image-20211109101209716

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

image-20211109101329985

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

image-20211109101439736

LR分析表構造算法

image-20211109101705653

2.5. LALR分析(lookahead-LR)

基本思想

image-20211109102539418

合並同心項集

image-20211109103349796

合並同心項集時產生 歸約-歸約沖突的例子

image-20211109110809370

合並同心項集后, 雖然不產生沖突, 但可能會推遲錯誤的發現

image-20211109110927187

LALR(1)的特點

image-20211109111228270

image-20211109111258905

2.6. 二義性文法的LR分析

二義性文法分析

image-20211109111718269

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

image-20211109111820889

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

image-20211109112329740

image-20211109112540525

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

image-20211109112644280

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

2.7. LR分析中的錯誤處理

image-20211109113116100

恐慌模式錯誤恢復

image-20211109113149746

短語層次錯誤恢復

image-20211109113219717

image-20211109113247662

image-20211109113347111


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM