語義分析可以分為兩類。
第1類是程式的分析,要求根據程式語言的規則建立其正確性,並保證其正確執行。對於不同的語言來說,語言定義所要求的這一類分析的總量變化很大。在lisp和smalltalk這類動態制導的語言中,可能完全沒有靜態語義分析;而在a d a這類語言中就有很強的需求,程式必須提交執行。其他的語言介於這兩種極端情況之間(例如 pascal 語言,不像a d a和c對靜態語義分析的要求那樣嚴格,也不像 lisp 那樣完全沒有要求)。
語義分析的第2類是由編譯程式執行的分析,用以提高翻譯程式執行的效率。這一類分析通常包括對「最優化」或**改進技術的討論。
這兩類分析也不是相互排斥的,因為與沒有正確性要求的語言相比,如靜態型別檢查這樣的正確性要求能使編譯程式產生更加有效的**。另外,值得注意的是,這裡討論的正確性要求永遠不能建立程式的完全正確性,正確性僅僅是部分的。但這樣的要求仍然是有用的,可以給程式設計人員提供一些資訊,提高程式的安全性和有效性。
屬性( attribute)是程式語言結構的任意特性。屬性在其包含的資訊和複雜性等方面變化很大,特別是當它們能確定時翻譯/執行過程的時間。
屬性直接與語言的文法符號相聯絡(終結符號或非終結符號) 。如果x是乙個文法符號,a 是x的乙個屬性,那麼我們把與x關聯的a的值記作x.a。
屬性的典型例子有:
• 變數的資料型別。
• 表示式的值。
• 儲存器中變數的位置。
• 程式的目標**。
• 數的有效位數。
屬性文法:
中其他符號的屬性值有關。每個關係用屬性等式(或語義規則)表示:
xi .aj = fij (x0.a1 , . . . , x0.ak ,x1.a1 , . . . , x1.ak , . . . , xn .a1 , . . . , xn .ak )
這裡的 fij 是乙個數學函式。屬性a1 , . . . , ak 的屬性文法(attribute grammar)是對語言的所有文法
規則的所有這類等式的集合。
屬性文法的**表示:
綜合屬性用於自下而上傳遞資訊,繼承屬性用於自上而下傳遞資訊。
編譯器預處理實現
我們寫 一般都會寫一些注釋,為了讓人更好的理解 但是對於編譯器來說,這些注釋都需要去除,為了實現預處理,就是去除注釋 換行 回車等,我用dfa 確定有限自動機 來實現。include include using namespace std define r 10 define c 8 dfa int...
編譯方舟編譯器
環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...
方舟編譯器編譯
目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...