1. 程式人生 > >【編譯原理】第二章 一個簡單的語法制導翻譯器

【編譯原理】第二章 一個簡單的語法制導翻譯器

一,語法定義

        1)文法:對語言結構的定義與描述。即從形式上用於描述和規定語言結構的稱為“文法”(或稱為“語法”),而未
涉及語義問題。

                                  例:有一句子:“我是大學生” 。這是一個在語法、語義上都正確的句子,該句子的結構(稱為語法結構)是由它的語法決定的。在本例中它為“主謂結構”

       2)文法定義

                文法G=(Vn,Vt,P,Z)
                        Vn:非終結符號集,語法變數
                         Vt:終結符號集,詞法單元
                          P:產生式或規則的集合
                           Z:開始符號(識別符號) Z∈Vn

           例:if(expression)   statement  else  statement;   

                   關鍵字if 和括號:為 終結符號(詞法單元)

                  expression、statement:非終結符號

      3)推導

           從一個要識別的符號開始推導,即用相應規則的右部來替代規則的左部,每次僅用一條規則去進行推導。從開始符號出發,不斷將某個非終結符號替換為該非終結符號的某個產生式的體。

        <句子>::=<主語><謂語>
        <主語>::=<代詞>|<名詞>
        <代詞> ::=你|我|他
        <名詞>::= 王民|大學生|工人|英語
        <謂語>::=<動詞><直接賓語>
        <動詞>::=是|學習
        <直接賓語>::=<代詞>|<名詞>

     4)語法分析

           接受一個終結符號串作為輸入,找出從文法的開始符號推匯出這個串的方法。如果不能從文法符號推到得到該終結符號串,則報錯。

     5)語法分析樹

           語法分析樹被定義為具有下述性質的一棵樹:
             1) 根由開始符號所標記;
             2) 每個葉子由一個終結符、非終結符、或ε標記;
             3) 每個內部結點由一個非終結符標記;
             4) 若A是某內部節點的標記,且X1,X2,...,Xn是該節點從左到右所有孩子的標記,則A→X1X2...Xn是一個產生式

。若A→ε,則標記為A的結點可以僅有一個標記為ε的孩子。 

     例子:9-5+2

             文法的產生式:list -> list + digit ;  

                                        list -> list - digit ; 

                                        list -> digit

                                        digit -> 0 | 1| 2| 3| 4| 5| 6| 7| 8|  9

                       非終結符:list  digit  list是文法開始符號

                       終結符:零個或多個終結符號組成的序列,零個終結符組成的串稱為空串

            語法分析樹:

                                                       list

                                                  /     |      \

                                            list        |         digit

                                       /     |    \     |            |

                                      list   |   digit |            |

                                       |     |     |    |            |

                                      9     -     5   +          2

          6)二義性

               一個文法可能有多顆語法分析樹,生成同一個給定的終結符號。

           例子:句子id+id*id可能的分析樹  

                     (id+id)*id    id+id*id    

           消除二義性:

                     ① 改寫二義文法為非二義文法;
                     ② 規定二義文法中符號的優先順序和結合性,使僅產生一棵分析樹。

          二義文法的優點:
                     ①  比非二義文法容易理解;
                     ②  分析效率高(分析樹低,直接推導步驟少)。

三,語法制導翻譯

        1)屬性:與某個程式構造相關的任意的量,屬性可以使多種多樣的,比如表示式的資料型別、生成的程式碼中的指令數目或為某個生成的程式碼中第一條指令的位置。

        2)翻譯方案:將程式片段附加到一個文法的各個產生式上的表示法。當在語法分析過程中使用一個產生式時,相應的程式片段就會執行。

        3)語法制導定義:把每個文法符號和一個屬性集合相關聯,並且把 ② 每個產生式和一組語義規則相關聯,這些規則用於計算與該產生式中符號相關聯的屬性值

四,語法分析

       1)語法分析:決定如何使用一個文法生成一個終結符號串的過程。原則上語法分析器必須能夠構造出語法分析樹,否則將無法保證翻譯的正確性

       2)語法分析分為:自頂向下分析方法和自底向上分析方法

       3)自頂向下分析方法:構造方法從根節點開始,逐步向葉子節點方向進行。

       4)預測分析法(遞迴下降分析法):自頂向下的語法分析方法,使用一組遞迴過程來處理輸入。

五,簡單表示式的翻譯器

        1)抽象語法樹:每個內部節點代表一個運算子(而不像語法分析樹 為非終結符號)

        2)將中綴表示式翻譯成字尾表示式:

package demo_parser;
import java.io.*;

public class Demo_Parser {
    static int lookahead;//位元組流以整數形式(ascii碼中對應十進位制數)表示
    public Demo_Parser() throws IOException
    {
        lookahead=System.in.read();//read方法以位元組流的方式來讀取命令列的輸入的資料
    }
    void term() throws  IOException  //如果是數字則輸出(不識別字母)
    {
        if(Character.isDigit((char)lookahead))
        {
            System.out.write((char)lookahead);
            match(lookahead);
        }
        else throw new Error("syntax error");
    }
    void match(int t)throws  IOException
    {
        if(lookahead == t)
            lookahead= System.in.read();
        else
            throw new Error("syntax error");
    } 
    void expr() throws IOException
    {
        term();
        while(true)
        {
            if(lookahead =='+')
            {
                match('+');
                term();
                System.out.write('+');
            }
            else if(lookahead == '-')
            {
                match('-');
                term();
                System.out.write('-');
            }
            else return;      
        }
    }
    
    
    public static void main(String[] args) throws IOException{
        
        Demo_Parser parser = new Demo_Parser();
        parser.expr();
        System.out.write('\n');
    }
}
六,詞法分析

        1)從輸入中讀取字元,並將它們組成”詞法單元物件“。構成一個詞法單元的輸入字元序列成為詞素。

        2)剔除空白和註釋:實現這個遠非易事

        3)預讀:比如讀到 then 還要往下讀,如果是空格或其他非識別符號則判斷為關鍵字。否則為識別符號(thenOther) 

                <=    >=   ==  <>

        4)識別關鍵字和識別符號:詞法分析採用一個表來儲存字串

七,符號表

        1)符號表:一種供編譯器用於儲存有關源程式構造的各種資訊的資料結構。這些資訊在編譯器的分析階段被逐步手機並放入符號表。

        2)符號表條目:在分析階段由,詞法分析器、語法分析器和語義分析器建立並使用。語法分析器建立。

        3)每個作用域設定一個符號表,其作用是將資訊從宣告的地方傳遞到實際使用的地方。

八,生成中間程式碼

        1)兩種中間表示形式:樹形結構,線性表示形式(特別是"三地址程式碼")

相關推薦

編譯原理第二 一個簡單語法制導翻譯器

一,語法定義         1)文法:對語言結構的定義與描述。即從形式上用於描述和規定語言結構的稱為“文法”(或稱為“語法”),而未 涉及語義問題。                                   例:有一句子:“我是大學生” 。這是一個在語法、語義上

編譯原理LL(1)語法分析器

1.專案要求文法要求:(1)從檔案讀入,每條產生式佔用一行(2)文法為LL(1)文法從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 LL(1)分析演算法判斷該符號串是否為該文法的句子。2.實驗思路:首先實現集合FIRST(X)構造演算法和集合FOLLOW(A)構造演算法,

編譯原理-第二 一個簡單語法指導編譯器-2.4 語法制導翻譯

語法制導翻譯: 定義:語法制導翻譯是通過向一個文法的產生式附加一些規則或程式片段而得到的 功能:給定詞法單元流,通過向一個文法產生式附加一些語義動 作,語法制導分析產生語法分析樹,並實現翻譯動作 相關概念: 屬性:表示與某個程式構造相關的任意的量,因為用文法符號(終結符號或非終結符號)來表示程式構造,所以

計算機網路原理第二 計算機網路體系結構

 計算機網路體系是現代計算機的核心,本章主要介紹了計算機體系結構和開放互連參考模型、TCP/IP協議以及比較。 一,總體概述 首先介紹了網路分層體系結構 第一,首先介紹了網路傳輸遵守的協議主要內容

編譯原理 第三 重點之一NFA轉化為DFA

NFA轉化為DFA: 書上的虛擬碼: 第一步: 求初始狀態s通過ε到達的所有點的集合*U[0]; 部分程式碼展示: int ii=0,jj=0; int U[ns][ns];for(ii=0;ii<ns;ii++)for(jj=0;jj<n

組成原理第一 計算機系統概述

表示 運算 傳遞 intro 指令 掌握 周期 style 主存 重點掌握:MAR和MDR的含義,主存容量大小、CPU執行時間的計算,性能指標CPI、MIPS、主頻等等。 1. 存儲單元:CPU訪問存儲器的基本單位,每個單元有一個地址。通常是字節大小的整數倍。 2. CPU

編譯原理c++實現自下而上語法分析器

不可 acm times style size PC -i 表達式 鏈接 寫在前面:本博客為本人原創,嚴禁任何形式的轉載!本博客只允許放在博客園(.cnblogs.com),如果您在其他網站看到這篇博文,請通過下面這個唯一的合法鏈接轉到原文! 本博客全網唯一合法URL:ht

zabbix 監控第二 安裝測試被監控主機

主動 server 安裝測試 zabbix 監控 spa emc 第二章 add-port listen 客戶端安裝測試 一、準備兩臺被監控主機,分別做如下操作: web129:192.168.19.129 web130:192.168.19.130 [root

算法第二上機實驗報告

也會 left 級別 family 基本 問題 str 排列 但是 實踐題目; 二分查找。 問題描述:輸入n值(1<=n<=1000)、n個非降序排列的整數以及要查找的數x,使用二分查找算法查找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和

c++自學第二

第1節  成員函式、物件拷貝、私有成員 一、綜述 二、類基礎:struct、class不混用 三、成員函式:類定義是可以多次include的 四、物件的拷貝:每個成員變數逐個拷貝(可以控制:在Time中重新定義“=”) 五、私有成員:只能被成員函式呼叫  

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

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

編譯原理作業二

151220129 計科 吳政億 厚書 3.7.1 (2)一個狀態 ϵ−closure(0)={0}=Aϵ−closure(0)={0}=A Dtran[A,a]=ϵ−closure(0,1

編譯原理作業八

編譯原理 作業8 151220129 計科 吳政億 [email protected] 6.4.3 中間程式碼: t1 = i * 16 t2 = j * 4 t3 = t1

編譯原理作業十四

編譯原理 第14次作業 151220129 計科 吳政億 [email protected] 第一題 9.2.1 gen kill B1B1 1,2

編譯原理作業十三

編譯原理 第13次作業 151220129 計科 吳政億 [email protected] 第一題 8.6.5 t1 = b * c LD R1,

編譯原理提取左部公因子演算法

下面是書中給出的演算法, 簡單的描述了兩句。但是實際上實現起來沒有那麼簡單。 在百度搜索提取左部公因演算法時也只有理論上的知識,並沒有實際的演算法。      https://github.com/hixiaosan/dragon_algorithm.git

編譯原理Flex、Bison的安裝與測試

Linux下安裝: sudo apt-get install flex bison flex -h bison -h 下載選擇 Complete Package,except sources 安裝

C語言第二-分支和迴圈語句-2

第2節   在本節中,我會用程式碼實現幾個例子,來供大家深入瞭解和學習分支以及迴圈語句。 查詢   查詢的含義就是在一個表中找出關鍵字與所給值相同的元素,如果找到了則返回下標,找不到則返回-1。   這裡先演示最為普通的查詢,逐個查詢,這是最為普通的演算法思想。

編譯原理利用Flex工具生成C語言詞法分析器

Flex構造C語言詞法分析器 可以識別大部分的C語言關鍵字和識別符號,可以去除註釋(多行單行都可以),可以識別整數和浮點數,可以識別錯誤的浮點數。 lex檔案結構: [第一部分:定義段] /* *按照C語言語法,宣告檔案包含,巨集定義,常數定義,全域性

軟體工程第二 軟體過程

2.1 軟體生存週期過程的概念 2.1.1 引入 軟體開發有哪些活動?(要做哪些對映?) 應如何正確組織開發活動,形成求解軟體的邏輯? 2.1.2 軟體生存週期過程在軟體工程知識框架中的位置 介於軟體開發本質和形成