U4_1 語法分析之自頂向下分析

文章目錄

  • 一、定義
    • 1、任務
    • 2、對比
    • 3、方法
    • 4、自頂向下面臨問題
  • 二、自頂向下分析
    • 1、概念
    • 2、特點
    • 3、二義性問題
    • 4、左遞歸問題
      • 1)概念
      • 2)消除
      • 3)間接左遞歸
    • 5、回溯問題
      • 1)概念
      • 2)消除
      • 3)解決方法
    • 6、總結
  • 三、遞歸子程序法(遞歸下降分析法)
    • 1、概念
    • 2、具體做法
  • 四、LL(1)文法
    • 1、預備知識
      • 1)FIRST集的計算
      • 2)FOLLOW的算法
    • 2、LL(1)文法的概念
    • 3、分析
      • 1)組成
      • 2)分析表
      • 3)符號棧
      • 4)執行程序
  • 五、LL(k)文法

一、定義

1、任務

根據語法規則(即語言的文法),分析并識別出各種語法成分,如表達式、各種說明、各種語句、過程、函數等,并進行語法正確性檢查

2、對比

詞法分析:3型(正則文法) 詞法分析:字符串
語法分析:2型(上下文無關文法) 語法分析:符號串

3、方法

  1. 自頂向下(Top-Down)分析:推導(Derivations)
    Z = > + S 則 S ∈ L ( G [ Z ] ) 否則 S ? L ( G [ Z ] ) Z =>^+ S \ \ \ \ 則 S \in L(G[Z]) \ \ \ 否則 S \notin L(G[Z]) Z=>+S????SL(G[Z])???否則S/L(G[Z])
  2. 自底向上(Bottom-Up)分析:規約(Reductions)
    Z < = + S 則 S ∈ L ( G [ Z ] ) 否則 S ? L ( G [ Z ] ) Z <=^+ S \ \ \ \ 則 S \in L(G[Z]) \ \ \ 否則 S \notin L(G[Z]) Z<=+S????SL(G[Z])???否則S/L(G[Z])

本節主要分析自頂向下方法

4、自頂向下面臨問題

推導順序:有多個“非終結符”,優先用哪個?
避免二義性:避免文法有多個可用規則。

問題:左遞歸問題+回溯問題
常見方法:遞歸子程序法+LL分析法

二、自頂向下分析

1、概念

給定符號串S,若預測是某一語法成分,則可根據該語法成分的文法,設法為S構造一棵語法樹,若成功,則S最終被識別為某一語法成分,即 S ∈ L ( G [ Z ] ) S\in L(G[Z]) SL(G[Z]),其中G[Z]為某語法成分的文法。若不成功, 則 S ? L ( G [ Z ] ) S \notin L(G[Z]) S/L(G[Z])

2、特點

  1. 分析過程是帶預測的,對輸入符號串要預測屬于什么語法成分,然后根據該語法成分的文法建立語法樹。
  2. 分析過程是一種試探過程,是盡一切辦法(選用不同規則) 來建立語法樹的過程, 由于是試探過程, 難免有失敗, 所以分析過程需進行回溯, 因此也稱這種方法是帶回溯的自頂向下分析方法
  3. 最左推導可以編寫程序來實現, 但帶溯的自頂向下分析方法在實際上價值不大, 效率低。

3、二義性問題

若對于一個文法的某一句子(或句型)存在兩棵不同的語法樹,則該文法是二義性文法,否則是無二義性文法。

若一個文法的某句子存在兩個不同的規范推導,則該文法是二義性的,否則是無二義性的。

若一個文法的某規范句型的句柄不唯一,則該文法是二義性的,否則是無二義性的。

PS:正則文法也會有二義性,但是可判定的(通過轉換為自動機)

文法的二義性是不可判定的,因此解決方法是提出一些限制條件,稱為無二義性的充分條件,當文法滿足這些條件時,就可以判定文法是無二義性的。

4、左遞歸問題

1)概念

令U是文法的任一非終結符,文法中有規則 U ∷ = U ? ? ? ? 或者 U = > U ? ? ? U∷=U····或者U => U··· U::=U????或者U=>U???

自頂向下分析的基本缺點是:不能處理具有左遞歸性的文法。
(如果在匹配輸入串的過程中,假定正好輪到要用非終結符U直接匹配輸入串,即要用U的右部符號串U¨¨去匹配,為了用U¨¨去匹配,又得用U去匹配,這樣無限的循環下
去將無法終止。)

2)消除

  1. 使用擴充的BNF表示來改寫文法
    (1) E ∷ = E + T ∣ T = > E ∷ = T E∷=E+T|T \ \ \ \ => E∷=T E::=E+TT????=>E::=T{ + T +T +T}
    (2) T ∷ = T ? F ∣ T / F ∣ F = > T ∷ = F T∷=T*F|T/F|F \ \ \ \ => T ∷=F T::=T?FT/FF????=>T::=F{ ? F ∣ / F *F|/F ?F∣/F}

具體規則
提因子:若: U ∷ = x y ∣ x w ∣ … . ∣ x z 則可改寫為: U ∷ = x ( y ∣ w ∣ … . ∣ z ) U∷=xy|xw|….|xz則可改寫為:U∷=x(y|w|….|z) U::=xyxw.∣xz則可改寫為:U::=x(yw.∣z)

若有文法規則: U ∷ = x ∣ y ∣ … … ∣ z ∣ U v 可以改寫為 U ∷ = ( x ∣ y ∣ … … ∣ z ) U∷=x|y|……|z|Uv可以改寫為U∷=(x|y|……|z) U::=xy……zUv可以改寫為U::=(xy……z){ v v v}
其特點是:具有一個直接左遞歸的右部并位于最后,這表明該語法類U是由x或y……或z其后隨有零個或多個v組成。
通過以上兩條規則,就能消除文法的直接左遞歸,并保持文法的等價性。

  1. 將左遞歸規則改為右遞歸規則
    若: P ∷ = P a ∣ b P∷=Pa| b P::=Pab 則可改寫為: P ∷ = b P ’???? P ’ ∷ = a P ’ ∣ ε P ∷= bP’ \ \ \ \ P’ ∷= aP’| ε P::=bP????P::=aP’∣ε
    在這里插入圖片描述

3)間接左遞歸

在這里插入圖片描述
此時需要代入成直接左遞歸后再處理
在這里插入圖片描述

  1. 檢查規則R是否存在直接左遞歸 R ∷ = S a ∣ a R∷=Sa|a R::=Saa
  2. 把R代入Q的有關選擇,改寫規則Q Q ∷ = S a b ∣ a b ∣ b Q∷=Sab|ab|b Q::=Sababb
  3. 檢查Q是否存在直接左遞歸
  4. 把Q代入S的右部選擇 S ∷ = S a b c ∣ a b c ∣ b c ∣ c S∷=Sabc|abc|bc|c S::=Sabcabcbcc
  5. 消除S的直接左遞歸 S ∷ = ( a b c ∣ b c ∣ c ) S∷=(abc|bc|c) S::=(abcbcc){ a b c abc abc}

5、回溯問題

1)概念

概念:分析工作要部分地或全部地退回去。

造成回溯的條件:文法中,對于某個非終結符號的規則其右部有多個選擇,并根據所面臨的輸入符號不能準確地確定所要的選擇時,就可能出現回溯。

2)消除

對于 U : : = α 1 ∣ α 2 ∣ α 3 U::= α_1 | α_2 | α_3 U::=α1?α2?α3?
定義: F I R S T ( α i ) = FIRST(α_i) = FIRST(αi?)={ a ∣ α i = > ? a … , a ∈ V t a | α_i =>^* a…, a \in V_t aαi?=>?a,aVt?}
為了避免回溯,對文法的要求是: F I R S T ( α i ) ∩ F I R S T ( α j ) = φ ( i ≠ j ) FIRST(α_i) ∩ FIRST(α_j)=φ (i\neq j) FIRST(αi?)FIRST(αj?)=φ(i=j)

3)解決方法

  1. 改寫文法
    判斷后若有相交,則需要把相交的部分提出放到高一級的文法中,如下例子:
    在這里插入圖片描述
  2. 超前掃描(偷看)
    當文法不滿足避免回溯的條件時,即各選擇的首符號相交時,可以采用超前掃描的方法,即向前偵察各輸入符號串的第二個、第三個符號來確定要選擇的目標。

這種方法是通過向前多看幾個符號來確定所選擇的目標,從本質上來講也有回溯的味道,因此比第一種方法費時,但是假讀僅僅是向前偵察情況,不作任何語義處理工作

6、總結

為了在不采取超前掃描的前提下實現不帶回溯的自頂向下分析,文法需要滿足兩個條件:

  1. 文法是非左遞歸的
  2. 對文法的任一非終結符,若其規則右部有多個選擇時, 各選擇所推出的終結符號串的首符號集合要兩兩不相交。

在上述條件下,就可以根據文法構造有效的、不帶回溯的自頂向下分析器。

對于第二點,我們只有 F I R S T FIRST FIRST集合是不夠的:
定義 F O L L O W ( A ) = FOLLOW(A)= FOLLOW(A)={ a ∣ Z = > ? … A a … , a ∈ V t a| Z=>^*…Aa…,a∈V_t aZ=>?AaaVt?}
A ∈ V n A \in V_n AVn? 該集合稱為A的后繼符號集合
特殊地: 若 Z = > ? . . . A 若Z =>^*...A Z=>?...A 則 # ∈ F O L L O W ( A ) ∈FOLLOW(A) FOLLOW(A)

不帶回溯的充分必要條件是:對于G的
每一個非終結符A的任意兩條規則 A : : = α ∣ β A::=α|β A::=αβ,下列條件成立:

  1. F I R S T ( α ) ∩ F I R S T ( β ) = Ф FIRST(α) ∩ FIRST(β) = Ф FIRST(α)FIRST(β)=Ф
  2. 若 β = = > ? ε , 則 F I R S T ( α ) ∩ F O L L O W ( A ) = Ф 若β==>^* ε, 則FIRST(α) ∩ FOLLOW(A) = Ф β==>?ε,FIRST(α)FOLLOW(A)=Ф

三、遞歸子程序法(遞歸下降分析法)

1、概念

具體做法:對語法的每一個非終結符都編一個分析程序,當根據文法和當時的輸入符號預測到要用某個非終結符去匹配輸入串時,就調用該非終結符的分析程序

2、具體做法

在這里插入圖片描述

  1. 檢查并改寫文法
    在這里插入圖片描述
  2. 檢查文法的遞歸性
    在這里插入圖片描述
    因此,Z和U的分析程序要編成遞歸子程序
  3. 算法框圖
    非終結符號的分析子程序的功能是:用規則右部符號串去匹配輸入串
    在這里插入圖片描述
    在這里插入圖片描述

要注意子程序之間的接口,在程序編制時進入某個非終結符的分析程序時其所要分析的語法成分的第一個符號已讀入sym中

遞歸子程序法對應的是最左推導過程

四、LL(1)文法

1、預備知識

1)FIRST集的計算

F I R S T ( α i ) = FIRST(α_i) = FIRST(αi?)={ a ∣ α i = > ? a … , a ∈ V t a | α_i =>^* a…, a \in V_t aαi?=>?a,aVt?}
α = > ? ε ,則 ε ∈ F I R S T ( α ) α=>^*ε,則ε \in FIRST(α) α=>?ε,則εFIRST(α)

α = X 1 X 2 . . . X n , X i ∈ V n U V t (即 X i ∈ V ) α=X_1X_2...X_n, X_i∈V_n \ \ U \ \ V_t (即 X_i ∈V) α=X1?X2?...Xn?,Xi?Vn???U??Vt?(即Xi?V)
首先求出組成α的每一個符號 X i X_i Xi?的FIRST集合
在這里插入圖片描述
在這里插入圖片描述
注意:要順序往下做,一旦不滿足條件,過程就要中斷進行
得到 F I R S T ( X i ) ,即可求出 F I R S T ( α ) FIRST(X_i),即可求出FIRST(α) FIRST(Xi?),即可求出FIRST(α)

2)FOLLOW的算法

算法:連續使用以下規則,直至FOLLOW集合不再擴大
在這里插入圖片描述

2、LL(1)文法的概念

第一個L:從左向右分析 (Left to right)
第二個L:產生“最左推導”(Left-most derivation)
k=1:向前查看“k=1”個符號,通過向前看1個符號就能夠有效分析
無二義,無左遞歸,且能夠消除回溯
因此判斷LL(1)文法的條件就是為了在不采取超前掃描的前提下實現不帶回溯的自頂向下分析所滿足的條件
無左遞歸且
在這里插入圖片描述

3、分析

1)組成

由三部分組成

  1. 分析表
  2. 執行程序 (總控程序)
  3. 符號棧 (分析棧)
    在這里插入圖片描述
    在實際語言中,每一種語法成分都有確定的左右界符,為了研究問題方便,統一以‘#’表示。

2)分析表

在這里插入圖片描述
在這里插入圖片描述
算法:
在這里插入圖片描述

3)符號棧

四種狀態
在這里插入圖片描述
在這里插入圖片描述

4)執行程序

主要實現如下操作

  1. 把#和文法識別符號E推進棧, 讀入下一個符號,重復下述過程直到正常結束或出錯。
  2. 測定棧頂符號X和當前輸入符號a,執行如下操作:
    KaTeX parse error: Expected 'EOF', got '#' at position 5: X=a=#?,分析成功,停止。E匹配輸入串成功。
    KaTeX parse error: Expected 'EOF', got '#' at position 5: X=a≠#?,把X推出棧,再讀入下一個符號。
    X ∈ V n X∈V_n XVn?,查分析表M。
    注意a)中U在棧頂!

在這里插入圖片描述
PS:文法沒有 x→ε,則不需要計算 FOLLOW 集!!!!

五、LL(k)文法

LL(k)是無二義性的文法,其識別的語言都是確定型下推自動機所識別的語言,但反之不能保證一個確定型下推自動機與LL(k)等價。因此關系圖如下:
一個無二義的CFG文法不一定能得到LL(k)文法
在這里插入圖片描述

LL(k)文法總是一個LR(k)文法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212665.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 線程池中 submit() 和 execute() 方法有什么區別?

Java 線程池中 submit() 和 execute() 方法有什么區別&#xff1f; 在 Java 中&#xff0c;ExecutorService 接口是用于管理和執行線程的框架&#xff0c;它定義了兩個用于提交任務的方法&#xff1a;submit() 和 execute()。這兩種方法有一些區別&#xff1a; 返回值&#xf…

【Proteus仿真】【51單片機】光照強度檢測系統

文章目錄 一、功能簡介二、軟件設計三、實驗現象聯系作者 一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使共陰數碼管&#xff0c;PCF8591 ADC模塊、光敏傳感器等。 主要功能&#xff1a; 系統運行后&#xff0c;數碼管顯示光傳感器采集光照強度值&#xff…

Gitzip插件【Github免翻下載】

今天給大家推薦一個github下載的插件&#xff0c;平常大家下載應該無外乎就是以下兩種&#xff1a; Download zip利用git clone 但是這兩種各有各的弊端&#xff0c;前者一般需要科學上網才可以&#xff0c;后者下載不穩定經常中途斷掉。 今天給推薦一個款瀏覽器插件-Gitzip.大…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SSM的美衣商城 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&#xff1a;Layui等 后端技術…

Flask和Vue框架實現WebSocket消息通信

1 安裝環境 1.1 安裝Flask環境 主要的安裝包 Flask、Flask-SocketIO&#xff0c;注意Python版本要求3.6 # Flask-SocketIO參考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基礎環境 # 更新pip python -m …

Unity發布WebGL測試界面處理方式參考

如果使用Unity發布WebGL經常會和網頁進行交互&#xff0c;為了能夠做到界面統一&#xff0c;往往所有UI都是在頁面上開發的&#xff0c;Unity本身不做任何UI或者只做三維UI&#xff0c;但是在開發過程中&#xff0c;為了測試接口&#xff0c;難免要在Unity中做一些UI來方便測試…

以太坊虛擬機EVM介紹,智能合約詳解

以太坊為例&#xff1a;什么是智能合約&#xff1f;智能合約怎么部署、調用、執行&#xff1f;智能合約的原理&#xff1f;智能合約存在哪兒&#xff1f;如何區分調用的是智能合約&#xff1f;世界狀態數據庫、EVM、智能合約它們之間的關系&#xff1f; 什么是智能合約 指的是…

【Hive】啟動beeline連接hive報錯解決

1、解決報錯2、在datagrip上連接hive 1、解決報錯 剛開始一直報錯&#xff1a;啟動不起來 hive-site.xml需要配置hiveserver2相關的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2連接的host --> <property><name>hive.server2.thrift.bin…

機器人與3D視覺 Robotics Toolbox Python 二 空間位姿描述

空間位姿描述 二維空間位姿描述 二維空間位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

如何理解 RPC 遠程服務調用?

本文主要講解 RPC 遠程服務調用相關的知識。 RPC 遠程服務調用是分布式服務架構的基礎&#xff0c;無論微服務設計上層如何發展&#xff0c;討論服務治理都繞不開遠程服務調用&#xff0c;那么如何理解 RPC、有哪些常見的 RPC 框架、實現一款 RPC 框架需要哪些技術呢&#xff…

解決electron修改主進程后需要重啟才生效

nodemon 是一種工具&#xff0c;可在檢測到目錄中的文件更改時通過自動重新啟動節點應用程序來幫助開發基于 node.js 的應用程序 nodemon 特性 自動重新啟動應用程序。檢測要監視的默認文件擴展名。默認支持 node&#xff0c;但易于運行任何可執行文件&#xff0c;如 python、…

自動駕駛學習筆記(十七)——視覺感知

#Apollo開發者# 學習課程的傳送門如下&#xff0c;當您也準備學習自動駕駛時&#xff0c;可以和我一同前往&#xff1a; 《自動駕駛新人之旅》免費課程—> 傳送門 《Apollo 社區開發者圓桌會》免費報名—>傳送門 文章目錄 前言 分類 目標檢測 語義分割 實例分割 …

SQL語句的執行順序怎么理解?

SQL語句的執行順序怎么理解&#xff1f; 我們常常會被SQL其書寫順序和執行順序之間的差異所迷惑。理解這兩者的區別&#xff0c;對于編寫高效、可靠的SQL代碼至關重要。今天&#xff0c;讓我們用一些生動的例子和場景來深入探討SQL的執行順序。 一、書寫順序 VS 執行順序 SQ…

【unity實戰】一個通用的FPS槍支不同武器射擊控制腳本

文章目錄 前言模型素材文章用到的粒子火光特效射擊效果換彈瞄準開槍抖動效果設置顯示文本最終代碼不同武器射擊效果1. 手槍2. 機槍3. 狙擊槍4. 霰彈槍5. 加特林 其他感謝完結 前言 實現FPS槍支不同武器效果&#xff0c;比如手槍&#xff0c;噴子&#xff0c;狙擊槍&#xff0c…

《使用ThinkPHP6開發項目》 - 創建應用

《使用ThinkPHP6開發項目》 - 安裝ThinkPHP框架-CSDN博客 《使用ThinkPHP6開發項目》 - 設置項目環境變量-CSDN博客 《使用ThinkPHP6開發項目》 - 項目使用多應用開發-CSDN博客 根據前面的步驟&#xff0c;我們現在就可以開發我們的項目開發了&#xff0c;根據項目開發的需要…

【數據挖掘】國科大蘇桂平老師數據庫新技術課程作業 —— 第四次作業

云數據庫研究 云計算與云數據庫背景 云計算&#xff08;cloud computing&#xff09;是 IT 技術發展的最新趨勢&#xff0c;正受到業界和學術界的廣泛關注。云計算是在分布式處理、并行處理和網格計算等技術的基礎上發展起來的&#xff0c;是一種新興的共享基礎架構的方法。它…

Django多對多ManyToManyField字段

Django是一個支持多對多關系的Web框架&#xff0c;可以在模型中定義多對多關系。多對多關系通常涉及兩個實體之間的復雜交互&#xff0c;例如用戶和組之間的關系&#xff0c;或者課程和學生之間的關系。在Django中&#xff0c;可以使用ManyToManyField字段來定義多對多關系。 …

[足式機器人]Part4 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;CLEAR_LAB 筆者帶更新-運動學 課程主講教師&#xff1a; Prof. Wei Zhang 南科大高等機器人控制課 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

機器學習基礎入門

機器學習 引言 介紹機器學習的重要性和應用領域。簡要說明機器學習與人工智能的關系。 在當今迅速發展的技術世界中&#xff0c;機器學習已經成為一項不可或缺的技術&#xff0c;它正在改變我們解決問題和理解世界的方式。機器學習&#xff0c;作為人工智能&#xff08;AI&a…

最新Redis7持久化(權威出版)

首先我們要知道什么是持久化&#xff1a;持久化是指將數據保存到磁盤上&#xff0c;以確保在Redis服務器重啟時數據不會丟失。 Redis支持兩種主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面讓我依次給你介紹一下&#xff1a; RDB持久化 作用 這是將Redis數據保存…