編譯原理語法分析概述

2021-09-28 12:28:35 字數 2565 閱讀 4281

讀一段程式和讀一篇文章的處理是有相似之處的

首先需要能夠認出乙個個字元(字,單詞或者標點)

然後理解文章的結構(段落,句子,句子內部主謂賓等結構)

最後再結合一些前置的知識和上下文,推導、理解每一句的含義,最後理解整個文章的含義

以上就對應了編譯的前三個階段 詞法分析 語法分析 語義分析

但是編譯的目的是讓計算機或者執行環境(而不是人腦)理解程式的含義,所以語義分析的階段就特別困難,因為人腦可以自然的學習和理解語言,但我們卻不知道人腦是怎麼做到的。我們只能保證語言的形式可以以語法樹的結構來表示和驗證,而語義的部分由形式本身來確定。這種由完全由形式確定語義的語言稱作形式語言(formal language),它可以使讓機器無歧義地理解程式這一目的變得容易實現。理解形式語言與自然語言的不同能夠將編譯的研究領域與自然語言識別的領域區分開來。

所以我們最終會由一棵語法樹來生成機器能夠理解的機器**,這個過程中會涉及到許多的優化技術,以及底層相關的知識。同時為了保證語言本身的跨平台特性,或者是出於優化的需要和編譯器實現的模組化要求,通常會先由語法樹生成中間**,這個過程中進行與平台無關的優化。再由中間**生成機器相關的**,中間摻雜進行機器相關的優化。

總結來說,編譯器的實現大概以中間**生成為界分為了前端和後端

整體步驟是:詞法分析->語法分析->語義分析(型別檢查,中間**生成和優化)->目標**生成和優化

因為有像llvm這樣的專案,我們設計一門語言可以只完成編譯器的前端,生成某種形式的中間**,然後和llvm的後端對接,llvm可以針對中間**進行優化,並生成指定機器格式的優化後的機器**。

當然,這些優化技術本身也有相當的學習價值,基本上可以說是基礎庫開發的idea**,因為他們本身就是如何改變程式的結構來達到目的(優化效能,優化表現形式等)的典範。

為什麼講詞法分析會提到正則語言,自動機,形式語言和形式系統這些東西?

這是我上編譯原理課的時候最為困惑不解的地方。

事實上形式語言的語法syntax本身就由詞法lexical和語法grammar共同決定,要解析出語法樹(syntax tree),兩者就不可分割

詞法分析的前置是形式語言的字母表,要得出乙個token流或符號表

語法分析的前置是推導規則構建的自動機,要得出一棵語法樹

前者的輸出是後者的輸入

一些形式語言的詞法本身也是由另一種形式語言定義的,比如c語言的詞法中識別符號和數字常量的定義可以由正規表示式定義。正規表示式是正則語言的表述工具,它內部實現了自動機。

而用來描述grammar的語言cfg又是另一種形式語言。

所以詞法分析和語法分析的本質都是形式語言的推導,或規約。他們的實現就是構建這麼乙個以字母表和自動機為基礎的形式系統。

由乙個字母表按一定規律推導出的乙個語言就是形式語言,它的文法就是形式語言的文法

比如由ascii字母表可以推導出c語言,c是一種形式語言

而形式語言的推導類似於初中所做的等式推導題

由乙個已知的條件集合和一組規則,經過多步的推導,推出了希望證明的結論

每一步推導都有想要證明的結論,使用的已知條件(比如各種代數規則,交換律結合律之類的),和使用的規則

推導成功就能把結論放入已知條件集合中,作為下一步推導的依據

乙個已知條件(形式語言的程式),結論(程式符合語法)加上推導和轉化規則(詞法/語法規則)構成了形式系統,比如乙個編譯器的語法解析器(syntax parser)

正則語言是最簡單的形式語言

它的字母表有空字串,普通字符集,代表特殊操作的有並/或(』|』),拼接/且(』』), 重複/閉包(*).

其他的常用擴充套件有(0或1次(?),1或更多次(+),指定次數,自定義字符集如[^a-z] 等)

推導規則就是匹配運算的自動機(連線,並,閉包這些運算也是匹配)

結論就是匹配成功,或者不成功

乙個推導中,產生式左邊(也就是結論)只有乙個非終結符的形式語言文法syntax稱為上下文無關文法

只有乙個非終結符,就意味著推導到某一步不需要根據前後文(也就是上下文)來確定該用什麼規則繼續推導。無論這個符號出現在**,它的推導方式都是相同的。

終結符就是不可再分的原子token,代表了不可再推導的狀態

非終結符是由非終結符和終結符遞迴構成的,代表了可以繼續推導的狀態

注意一點 正則文法和上下文無關文法的區別是正則文法無法記憶狀態,只能知道當前狀態是什麼。

正則文法的推導不允許遞迴,也就是用結論推結論(數學歸納法),而上下文無關文法的非終結符的推導支援遞迴

不支援遞迴推導意味著什麼?

比如要匹配一些遞迴巢狀的結構

例如(((i+1) * 2) -7)/2)使用正則文法無法將其識別為乙個表示式,還有將類似if …else…的巢狀識別為乙個if塊都不能用正則文法推導

但是正則語言可以判斷操作的數量是否能夠被狀態數k整數。如果總狀態數為2,就是判斷操作出現的奇偶性。像是成對出現的標籤的匹配是可以用正規表示式去做的,這其中沒有用到遞迴推導,只是識別乙個開始和乙個對應的結束 ,如果輸入本身不滿足成對出現,最後一定會匹配不成功。

遞迴本身和記憶自身狀態等價,因此也可以說正則文法沒有記憶之前狀態的功能。一些正規表示式中有像是可以指定出現次數,還有回溯這樣的功能,這其實已經超出了正則語言的範疇。

編譯原理 1 4 語法分析概述

語法分析是編譯的第二個階段,語法分析的主要任務是從詞法分析器輸出的token序列中識別出各類短語,並構造語法分析樹,語法分析樹描述了句子的語法結構。例 賦值語句的分析樹 例 position initial rate 60 序號 種別碼 屬性值 其中position initial rate都是識別...

語法分析 編譯原理

實驗目的 對迴圈語句和條件判斷語句編寫詞法分析編譯程式,只能通過一遍掃瞄完成。用c 實現 實驗要求 1 關鍵字 for if then else while do 所有關鍵字都是小寫。2 運算子和分隔符 3 其他識別符號 id 和整型常數 num 通過以下正規式定義 id letter letter...

編譯原理 語法分析

根據上課內容順序寫的部落格,並不是按照書的目錄來的 使用龍書以及編譯程式設計原理 第二版 金成植 金英編著 老師的ppt是英文的,我自己隨便翻的,不一定對 上下文無關文法 語法分析書和抽象語法樹 二義性簡單語言的語法 知識圖譜 語法分析器的功能輸入 詞法單元 詞法單元序列 輸出 語法結構的內在表示式...