1. 程式人生 > >編譯原理:素短語、短語、直接短語、控制代碼的基本概念

編譯原理:素短語、短語、直接短語、控制代碼的基本概念

素短語的概念它是一個遞迴的定義,少含有一個終結符,並且除它自身之外不再含任何更小的素短語,所謂最左素短語就是處於句型最左邊的素短語的短語。而一個算符優先文法G的任何句型的最左素短語是滿足以下條件的最左子串NaNb…NcNdN(N是非終結符,a,b,c,d是終結符)

例項:句型T+T*F+id,求出其語法樹,可知,T*F是最左素短語,id也是素短語,但不是最左的。

短語和直接短語的概念一個句型的語法樹中一子樹葉結點所組成的符號串都是該句型的短語,當子樹中不包含其他更小的子樹時,該子數葉結點所組成的字串就是該句型的直接(簡單)短語。

控制代碼的概念一個句型的最左直接短語匯稱為該句型的控制代碼


例子1:

E->T|E+T

T->F|T*F

F-> (E) | i

給出句型T*F+i的最右推導。

1.首先通過最右推導(也叫規範推導):

E=>E+T=>E+F=>E+i=>T+i=>T*F+i

2.畫出語法樹

                 E

                  /     |     \

                E     +      T

                |              |

               T             F

           / |    \          |

        T      *    F       i

因此本題的直接短語的為 T*F、i,短語有T*F+i, T*F, i。控制代碼是T*F.

+號不是直接短語,因為+所在的樹中那個E,T結點還推出來一顆子樹,所以它不是。


 例子2 

-> a|b|(T)

T -> TdS|S

題目中的句型可用下面的語法樹表示:
            S
         /  |  \
       (    T    )
         /  |   \
      T     d    S
   /  |  \          |
 T  d  S        b
 |      /   |   \
S     (   T     )

因此本題的直接短語的為S 、(T)、b,短語有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db)

d不是直接短語,因為d所在的樹中那個T結點還推出來一顆子樹,所以它不是。

素語是一個短語,它至少含有一個終結符,而且除它自身以外不再含有更少的素短語,對於句型(Sd(T)db)的素短語是(T)、b.

除了畫語法樹,還可以通過直接推導的結果,不過個人覺得很容易出錯,我們還是畫語法樹吧。

收集了一些總結,方便查詢。

每個句型對應一棵語法樹 
每棵語法樹的葉子結點從左到右排列構成一個句型 
每棵語法樹的子樹的葉子結點從左到右排列構成一個短語 
每棵語法樹的簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成一個簡單(直接)短語 
每棵語法樹的最左簡單子樹(只有父子兩層結點)的葉子結點從左到右排列構成控制代碼 
素短語是至少包含一個終結符的短語,但它不能包含其它素短語 
最左推導:在每個推導過程中,總是首先考慮對當前最左邊的非終結符號進行推導 
最右推導:在每個推導過程中,總是首先考慮對當前最右邊的非終結符號進行推導

嗯,今天的複習總結到這。


相關推薦

編譯原理短語短語直接短語控制基本概念

素短語的概念:它是一個遞迴的定義,至少含有一個終結符,並且除它自身之外不再含任何更小的素短語,所謂最左素短語就是處於句型最左邊的素短語的短語。而一個算符優先文法G的任何句型的最左素短語是滿足以下條

GetWindowGetTopWindow和GetNextWindow(視窗控制獲取!!!)

GetWindow //uCmd 可選值:   GW_HWNDFIRST = 0; {同級別第一個}   GW_HWNDLAST  = 1; {同級別最後一個}   GW_HWNDNEXT  = 2; {同級別下一個}   GW_HWNDPREV  = 3;

Android異常一非同步任務導致的視窗控制洩漏問題(記憶體洩漏)

首先來看一下報錯日誌: 05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window [email protected] that was orig

編譯原理短語直接短語控制短語

概念 如果S->* αAβ and A->+γ,則稱γ是句型αγβ的相對於變數A的短語  如果S->* αAβ and A->γ,則稱γ是句型αγβ的相對於變數A的直接(簡單)短語 最左直接短語叫做控制代碼 其實最簡單的判斷方法直接畫出語法樹

編譯原理之找短語控制短語

1.定義 句型、句子、語言 設文法G=(VT,VN,S和P)。如果S =>* α,則稱α是一個句型。僅含終結符號的句型是一個句子。語言 L(G)是有文法G產生的所有句子組成的集合:L(G)

編譯原理之子樹與短語控制

·語法樹與子樹                 語法樹 根:開始符號 子樹:某一非終結符號(子樹的根)及其下面的分支 葉:樹的末端結點 語法樹的全部末端結點(自左向右)形成當前句型                     ·子樹與短語、控制代碼 1、短語:子樹

控制最左短語可歸字首

控制代碼、最左素短語、可歸字首 1.定義 控制代碼:最左直接短語(一個句型的語法樹中任一子樹葉結點所組成的符號串都是該句型的短語); 最左素短語:處於矩形最左邊的素短語(素短語是包含有終結符的短語); 可歸字首:規範句型的一個字首,這種字首包含控制代碼且不包含

短語控制短語最左短語

很久沒寫部落格了=== 今天寫一發=== 關於編譯原理 語法樹 控制代碼 簡單短語 短語 的區分,通過兩個例子來理解概念以及方法: 例子1——語法樹 S -> a|b|(T) T -> TdS|S Vt={a,b,d,(,)}.Vn={S,T},S

短語直接短語控制短語

以此為例子: 先畫出語法樹,例:                S        /       |        \      (         T         )           /     |     \         T      d      S     /    |   \  

編譯原理引論

教材 低級語言 程序 quest mce 語言翻譯 後端 高級 del 閱讀的教材為:編譯原理(張素琴等編著,清華大學出版社) 編譯過程就是將高級語言翻譯為低級語言 編譯過程分為前段(front end)和後端(back end) 閱讀過程中遇到的疑問是:解釋程序和編譯程序

7鏈表(下)如何輕松寫出正確的鏈表

head 邊界條件 所有 倒數第n個結點 程序 執行 例子 操作 刪除 很汗顏,現在讓自己完整的寫出一個簡單的鏈表結構竟然會無法動筆,作為一個程序猿,需要修行的路還很長。 技巧一:理解指針或引用的含義 將某個變量賦值給指針,實際上就是將這個變量的地址賦值給指針,或者反過來說

編譯原理引言

編譯器的概述 編譯器是一個程式 核心功能是把原始碼翻譯成目的碼 原始碼: C/C++, Java, C#, html, … 目的碼: x86, IA64, ARM, MIPS, …

編譯原理FIRST set概念及其演算法的程式碼實現

 本篇博文是作為陳老師的編譯器課程學習筆記 課程地址: https://study.163.com/course/courseLearn.htm?courseId=1002830012#/learn/video?lessonId=1003433001&cours

編譯原理語法分析1-遞迴下降

要求: 使用的文法如下: E →TE’ E → + TE’ | ε T → FT’ T →* FT’ | ε F → (E) | id 對於任意給定的輸入串(詞法記號流)進行語法分析,遞迴下降方法實現。 要有一定的錯誤處理功能。即對錯誤能提示,並且

C# winform winApi 根據傳入handle 控制獲取 其它視窗,如使用中的子視窗同級視窗等。

//根據傳入的視窗控制代碼,獲取到同級、頂級、低階的視窗,根據GetWindowCmd 傳入的不同獲取也不同,詳細看GetWindowCmd 類說明 [DllImport("user32.dll", SetLastError = true)] static exter

編譯原理用Yacc實現簡易計算器

要求 下載bison 下載之後解壓即可 配置環境變數 ①在系統變數Path中新增如下變數 \user\local\wbin可以在剛才解壓的資料夾裡找到 ②在系統變數中新增變數BISON_SIMPLE和BISON_HAIRY,變數值如下圖 生成.

Linux的開啟檔案表開啟檔案表檔案描述符開啟的檔案控制以及i-node之間的關係

    在Linux系統中一切皆可以看成是檔案,檔案又可分為:普通檔案、目錄檔案、連結檔案和裝置檔案。檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行I/O操作的系統呼叫都通過檔案描述符。程式剛剛啟動的

編譯原理將a+d*(b-c) 寫成逆波蘭表示式

逆波蘭表示式示例 1. a+b 改為 ab+ 2. (a+b)*(c+d) 改為 ab+cd+* 3. a+d*(b-c) 改為 adbc-*+ 逆波蘭表示式又叫做字尾表示式,顧

編譯原理LL(1)文法 語法分析器(預測分析表法)

設計要求:對於任意輸入的一個LL(1)文法,構造其預測分析表,並對指定輸入串分析其是否為該文法的句子。思路:首先實現集合FIRST(X)構造演算法和集合FOLLOW(A)構造演算法,再根據FIRST和F

編譯原理什麼是編譯程式?

核心觀點: 一個編譯程式就是一個語言翻譯程式。就是把一種語言書寫的程式翻譯成另一種語言(目標語言)的等價程式。 重要性: 一個編譯程式的重要性體現在它使得多數計算機使用者不必考慮與機器有關的繁瑣細節,使程式設計師和程式設計專家獨立於機器,這對於當今機器