編譯原理:LL1、LR0、SLR1、LR1、LALR1


1 FIRST&FOLLOW

1.1 FIRST集合

First(α) 是可從 α 推導得到的句型的首終結符號的集合

image-20210116145324190

計算FIRST(X)集合算法:

  • 計算每個符號X的First(X)集合
image-20210116150338983
  • 計算每個符號串 α 的 First(α) 集合

    image-20210116150518674

1.2 FOLLOW集合

Follow(A) 是可能在某些句型中緊跟在 A 右邊的終結符的集合

image-20210116150204396

計算FOLLOW(X)集合算法:

  • 為每個非終結符 X 計算 Follow(X) 集合

    image-20210116150743310

2 LL(1)

如果文法 G 的預測分析表是無沖突的, 則 G 是 LL(1) 文法

對於當前選擇的非終結符, 僅根據輸入中當前的詞法單元即可確定需要使用哪條產生式

預測分析表指明了每個非終結符在面對不同的詞法單元或文件結束符時, 該選擇哪個產生式 (按編號進行索引) 或者報錯

  • L : 從左向右 (left-to-right) 掃描輸入
  • L : 構建最左 (leftmost) 推導
  • 1 : 只需向前看一個輸入符號便可確定使用哪條產生式

2.1 構建預測分析表

先計算FIRST、FOLLOW集合

image-20210116152100751

注:或者關系,兩者都要檢查!

例子:

image-20210116152249859

2.2 改造為LL(1)

2.2.1 提取左公因子

image-20210116153257570

2.2.2 消除左遞歸

  • 直接左遞歸的消除方法:

    image-20210116152611509

    例如:

    E → E + T | T

    消除后為:

    E → T E′

    E ′ → + T E′ | ϵ

  • 非直接左遞歸

    思想:無環圖

    image-20210116153035174

    image-20210116153044330

    例子:

    image-20210116153215385 image-20210116153234519

2.3 LL(1)語法分析器偽代碼

image-20210116145239560

3 LR

3.1 什么是LR

L : 從左向右 (Left-to-right) 掃描輸入

R : 構建反向 (Reverse) 最右推導

image-20210116154534821

兩大操作: 移入輸入符號按產生式歸約

主要問題:

  • 何時規約?
  • 按哪條產生式規約?

3.2 LR分析表

image-20210116154817549 image-20210116154852959
  • 例子:棧上的移入與規約

    image-20210116161844367

  • 問題:在當前狀態 (編號)下, 面對當前文法符號時, 該采取什么動作

    思路:可以用自動機跟蹤狀態變化 (自動機中的路徑 ⇔ 棧中符號/狀態編號)

  • 何時規約?

    必要條件: 當前狀態中, 已觀察到某個產生式的完整右部,也就是句柄

    Definition (句柄 (Handle))

    在輸入串的 (唯一) 反向最右推導中, 如果下一步是逆用產生式 A → α 將 α 歸約為 A, 則稱 α 是當前句型的句柄。

    image-20210116155640688
  • Theorem 存在一種 LR 語法分析方法, 保證句柄總是出現在棧頂

4 LR(0)

4.1 LR(0)文法

如果文法G的LR(0)分析表是無沖突的,則G是LR(0)文法

無沖突:ACTION表中每個單元格最多只有一種操作

  • L : 從左向右 (Left-to-right) 掃描輸入

  • R : 構建反向 (Reverse) 最右推導

  • 0 : 歸約時無需向前看

4.2 LR(0)自動機

Definition (LR(0) 項 (Item))

文法 G 的一個 LR(0) 項是 G 的某個產生式加上一個位於體部的點

項指明了語法分析器已經觀察到了某個產生式的某個前綴

image-20210116155852780

Definition (項集)

項集就是若干項構成的集合

句柄識別自動機的一個狀態可以表示為一個項集

Definition (項集族)

項集族就是若干項集構成的集合

句柄識別自動機的狀態集可以表示為一個項集族

Definition (增廣文法 (Augmented Grammar))

文法 G 的增廣文法 G′ 是在 G 中加入產生式 S ′ → S 得到的文法

目的: 告訴語法分析器何時停止分析並接受輸入符號串

當語法分析器面對 $且要使用 S ′ → S 進行歸約時, 輸入符號串被接受

Example:LR(0) 句柄識別自動機(紅圈表示接受狀態)

image-20210116160058568

4.3 構造LR(0)自動機

需要知道的:閉包的計算

image-20210116160544085
  • init

    image-20210116160621662

  • 演化

    image-20210116160734039 image-20210116160645402
  • 接受狀態

    image-20210116160754703

  • accept狀態

    image-20210116161533524

    下,遇見$的轉移

    千萬不要漏掉accept!

4.4 構造LR(0)分析表

  1. 先構造出LR(0)自動機,每個自動機的狀態對應LR(0)分析表中的一個狀態

  2. 根據以下規則,構造LR(0)分析表

    image-20210116161228528
  3. 如果文法 G 的LR(0) 分析表是無沖突的, 則 G 是 LR(0) 文法

5 SLR(1)

Simple LR(1)

5.1 LR(0)存在的問題

LR(0) 分析表每一行 (狀態) 所選用的歸約產生式是相同的

5.2 改進

對LR(0)的規約規則進行改進

image-20210116163930031

6 LR(1)

6.1 LR(0)與SLR(1)存在的問題

  • LR0

    image-20210116163530517
  • SLR1

    image-20210116164433903

6.2 LR(1)項

Definition (LR(1) 項 (Item))

[A → α · β, a] (a ∈ T ∪ {$}) 此處, a 是向前看符號, 數量為 1

思想: α 在棧頂, 且剩余輸入中開頭的是可以從 βa 推導出的符號串

也就是說,[A → α·, a]只有下一個輸入符號為 a 時, 才可以按照 A → α 進行歸約

6.3 LR(1)自動機

  • LR1閉包計算

    image-20210116164646724
  • LR1初始化

    image-20210116164709796

  • LR1的GOTO計算

    image-20210116164727388
  • LR1自動機構造

    image-20210116164748274

6.4 LR(1)分析表

image-20210116170629909

7 LALR(1)

7.1 LR(1)的問題

LR(1) 雖然強大, 但是生成的 LR(1) 分析表可能過大, 狀態過多

LALR(1) : 合並具有相同核心 LR(0)項的狀態 (忽略不同的向前看符號)

7.2 合並核心項

image-20210116171016290

例如,合並圖中的(4,7),(3,6),(8,9)

7.3 引入沖突?

對於 LR(1) 文法, 合並得到的 LALR(1) 分析表是否會引入沖突?

  • 不會引入移入/歸約沖突

    假設合並后出現沖突,[A → α·, a] 與 [B → β · aγ, b]

    則在 LR(1) 自動機中, 存在某狀態同時包含 [A → α·, a] 與 [B → β · aγ, c] (c隨便是什么)

  • 可能會引入歸約/歸約沖突

8 例題

8.1 LR0、SLR1

image-20210116232017203

image-20210116232034684

image-20210116232041655

8.2 LR1、LALR1

image-20210116232100595

image-20210116232108019

image-20210116232114937


免責聲明!

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



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