1. 程式人生 > >編譯原理與編譯構造 LR文法

編譯原理與編譯構造 LR文法

本份課堂筆記來源於我院最最高大的七米八同學,不知道他用不用CSDN寫部落格,但是不管如何向他表示感謝。

LR文法——通用語法分析法,基於規約、FA

對於文法BαAβ,Aγ ,我們有自動機,確切地說,是分層的有限自動機(NFA),如下圖。

Markdown

對於每個狀態(就是每個圈)的命名,我們不會和以前一樣一路AZ命名下來,而是會有特定的命名方式。

狀態命名

狀態命名:LR{

就比如說,第一層的加黃的狀態是BαAβ ,第一層加藍的狀態是BαAβ

第二層的最左邊狀態是Aγ

其中,BαAβ 這種點在最後的L

R 項,叫做“可歸約LR 項”,否則叫做“移進LR 項(shiftLRitem)”

狀態的拓展

NFA{ϵ

if(BαAβIi) {

AγIi

}

這個證明很簡單,我們看一下之前的那張圖,Aγ 這個狀態是由BαAβ 這個狀態由ϵ 邊轉換過去的,只需要結合之前的知識加上知道這是狀態內部的拓展,就能得到結論了。

公式

BαβγIi β BαβγIj

看了看效果,我決定下面一個公式還是手畫一下吧。。

Markdown

對於上面的兩組公式,β 既可以是終結符,也可以是非終結符

轉換模型

我們有這樣的語法:EE+TETTTFTFF(E)Fi ,要構造這個語法的轉換模型。

首先講一下LR轉換模型,這個跟LL(1)的轉換模型結構是差不多的。不過左邊的棧變了,有一個狀態棧和符號棧。LR分析程式,應該說差不多也是LR轉換表,也變了。

Markdown

對於剛剛的語法,我們二話不說,先加一個0號產生式:SE

為什麼要加一個0號產生式?因為這樣使得分層狀態自動機最上層有且僅有一個自動機,且有且僅有一個初始狀態。

轉換圖

下面看一下分層有限狀態自動機,如果看不懂的話可能需要補一補前面的課。

Markdown

這個圖主要是示意一下的I0 是怎麼得到的,跟以前的做法是一樣的,通過ϵ

產生式來得到。此時通過移點來獲取別的狀態,此處忽略過程,因為挺好懂的,直接看圖就能看懂。

Markdown

注意要結合前面的公式。

轉換表

我們由上面的轉換圖來獲取轉換表。

Markdown

上圖就是轉換表,符號含義如下:

1)Sj means shift and stack state j, and the top of the stack change into(j,a);

2)rj means reduce by production numbered j;

3)accept means accept

4)blank means error

有以下的主要規則:

Markdown

Markdown

Markdown

如果說這個不是很好理解的話,我們可以這麼來看。首先ACTION 表最上方全填終結符,另外要加一個$ 符號,然後GOTO 最上方全填非終結符。顯然,GOTO 表相當好填,我們只需要在狀態轉換的箭頭上找到非終結符,然後填就可以了。例如I0TI2 ,就顯然有Markdown

對於填Sx 這個也是很簡單,我們只需要在狀態轉移的箭頭上找到終結符就好了。例如I0iI5 ,我們就有

Markdown

然後最複雜的顯然是rx 。此時我們把語法再拉過來:0.SE1.EE+T2.ET

相關推薦

編譯原理編譯構造 LR文法

本份課堂筆記來源於我院最最高大的七米八同學,不知道他用不用CSDN寫部落格,但是不管如何向他表示感謝。 LR文法——通用語法分析法,基於規約、FA 對於文法B→αAβ,A→γ ,我們有自動機,確切地說,是分層的有限自動機(NFA),如下圖。

深入理解flutter的編譯原理優化

bottom 熱更新 pre ted 符號 註釋 跟蹤 data 傳遞 摘要: 閑魚技術-正物 問題背景 對於開發者而言,什麽是Flutter?它是用什麽語言編寫的,包含哪幾部分,是如何被編譯,運行到設備上的呢?Flutter如何做到Debug模式Hot Reload快速生

編譯原理】深入淺出構造 First 集和 Follow 集的演算法流程

First集構造流程     對於 X -> ... 這條產生式而言,     【1】若右邊第一個符號是終結符或 ε  ,則直接將其加入 First(X)     【2】若右邊第一個符號是非終結符,則將其 First 集的的非 ε  元素加入

編譯原理flex自動構造詞法分析基本瞭解

安裝flex 在Ubuntu下安裝flex非常簡單,只需要在終端中輸入 sudo apt-get install flex 即可; 如果說找不到flex,可能你需要更新系統的源,百度一下“Ubuntu更新源”,應該可以解決; flex 什麼是flex? fl

編譯原理上機作業4——LR(0)分析的DFA生成

input檔案 =*i XSLR X->S S->L=R S->R L->*R L->i R->L # code #include <iostream> #include <cstdio> #include <

編譯原理 第六章 屬性文法和語法制導翻譯

一、知識總結        首先學習了屬性文法,屬性文法是在上下文無關文法的基礎上為每個文法符號(終結符或非終結符)配備若干個相關的“值”,稱為“屬性”。屬性分為綜合屬性和繼承屬性。綜合屬性用於“自下而上”傳遞資訊,在語法樹中,一個結點的綜合屬性的值,由其子結點的屬性值確定。

編譯原理之手工構造C語言詞法分析器

編寫一個(C語言)詞法分析器:需求是:1對原來的資料進行預處理,刪掉註釋;(為了展示方便,就不刪掉換行,製表符了,本來應該是要刪掉這些的)2將詞法正確的token分解出來,一共應該有5類,識別符號,關鍵字,常數,界符,運算子,對於原來的原始碼,將token之間都加上空格;3對

交叉編譯實踐-交叉編譯原理簡單應用

/****************************************************************************************/ /*           獲取更多乾貨技能,點選 [這裡-小編文章列表] 主頁左側掃碼關

編譯原理之證明LL(1)文法

LL(1)文法的證明方法 一個文法G是LL(1)的,當且僅當G的任意兩個不同的產生式A -> α | β 滿足下面的條件: 1. 不存在終結符號a使得α 和 β 都能夠推匯出以a開頭的串。 2. α 和 β中最多隻有一個可以推匯出空串。 3. 如果

編譯原理第六章-屬性文法和語法制導翻譯

      第六章主要講了屬性文法、語義規則、基於屬性文法的處理、S屬性的自下而上計算、L-屬性文法的自頂向下翻譯等內容。一些基本的概念:屬性文法:是在上下文無關文法的基礎上為每個文法符號(終結符或非終結符)配備若干個相關的“值”(稱為屬性)。屬性:代表與文法符號相關的資訊,

編譯原理組合語言的概念區別

      編譯原理旨在介紹編譯程式構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間程式碼生成、儲存管理、程式碼優化和目的碼生成。       組合語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他

編譯原理LR 分析法構造 LR(1) 分析表的步驟 - 例題解析

《編譯原理》LR 分析法與構造 LR(1) 分析表的步驟 - 例題解析 筆記 直接做題是有一些特定步驟,有技巧。但也必須先了解一些基本概念,本篇會通過例題形式解釋概念,會容易理解和記憶,以及解決類似問題。 如果只想做題可以直接下拉至習題部分。 (一)關於狀態 對於產生式 A→aBcD,就可以分解為下面幾個不同

編譯原理根據專案集規範族構造LR(0)分析表

上回把文法的LR(0)專案集規範族搞了半天,革命進行了一半。 鼓搗了半天整了一堆專案集規範族出來,總是有用的呀,接下來就是在那堆的基礎上構造分析表了,構造好分析表就能分析輸入串了。本文主要講LR(0)分析表的構造和輸入串分析過程。 我這個菜雞都覺得是通!俗!易!懂!的!! 憋說話往下

編譯原理LR(0)專案集規範族的構造詳解

學編譯原理的時候,感覺什麼LL(1)、LR(0)、SLR(1)、LALR(1)思想滿天飛。 而且做題的時候,一不留意,一道題就寫了三頁紙了。 就拿今天這個玩意兒來講,我真的是考試前花了最多的時間,搞懂了(差不多搞懂了)這是個什麼玩意兒。 以下內容,做題的話應該夠了而且很!容!易!理!

編譯原理LR(0)專案集規範族的構造

編譯原理中LR(0)專案集規範族的構造   此文略長。我也沒想到這寫起來這麼多,但對構造過程絕對清楚,一步步慢慢看吧。      LR的第一個L和LL的第一個L含義相同,即從左到右掃描句子 ,第二個R表示Right most最右推導。      在通常的描述中,後面還有一個括號裡面的數字如,L

編譯原理之LL(1) 、LR(0)、SLR、LR(1)、LALR文法的對比

考完編譯原理有一段時間了,記得當時都被以上這五種文法搞懵了,所以希望寫篇文章幫助那些正在學習的人。以下內容是依據龍書中文版講解的,由於老師不同可能某些地方大同小異,如有什麼紕漏之處還請指出,多謝~ 以下文章參考了:LL LR SLR LALR 傻傻分不清。 首先來看張圖,上圖是四種文法的包含

編譯原理——LL(1) 文法First,Follow集合的構造過程

  LL(1)文法是上下文無關文法的一個真子集,在學習過程中我們通常需要了解如何判斷一個文法屬於LL(1)文法。來了解判斷條件之前我們需要構造First,Follow, Select三個集合。以下介紹三個集合的定義,含義,結合例項來體會這些集合的構造過程。 1. First

編譯原理(九) LR(0)文法分析法(演算法描述和C++程式碼實現)

後期DEBUG發現make_set函式和make_go存在問題,於2015年12月4日更新了程式碼,見諒 概念梳理 最左推導:每一步替換最左邊的非終結符 最右推導:每一步替換最右邊的非終結符,最右推導稱為規範推導 短語:令G是一個文法,S是文法的開始符號

編譯原理SLR(1)文法的C++實現(基於SLR(1)分析法的語法制導翻譯及中間程式碼生成程式設計原理實現)

程式功能描述完成以下描述賦值語句 SLR(1)文法語法制導生成中間程式碼四元式的過程。G[A]:A→V=EE→E+T∣E-T∣TT→T*F∣T/F∣FF→(E)∣iV→i[設計說明] 終結符號i為使用者定義的簡單變數,即識別符號的定義。[設計要求](1)構造文法的SLR(1)

編譯原理LR(0)專案集規範族的構造和分析的構造

學編譯原理的時候,感覺什麼LL(1)、LR(0)、SLR(1)、LALR(1)思想滿天飛。而且做題的時候,一不留意,一道題就寫了三頁紙了。就拿今天這個玩意兒來講,我真的是考試前花了最多的時間,搞懂了(差不多搞懂了)這是個什麼玩意兒。以下內容,做題的話應該夠了而且很!容!易!理