編譯器實現(六)

1.語義分析

語義分析能夠分爲兩類。編程

第1類是程序的分析,要求根據編程語言的規則創建其正確性,並保證其正確執行。對於不一樣的語言來講,語言定義所要求的這一類分析的總量變化很大。在LISP和Smalltalk這類動態制導的語言中,可能徹底沒有靜態語義分析;而在A d a這類語言中就有很強的需求,程序必須提交執行。其餘的語言介於這兩種極端狀況之間(例如 Pascal 語言,不像A d a和C對靜態語義分析的要求那樣嚴格,也不像 LISP 那樣徹底沒有要求)。安全

語義分析的第2類是由編譯程序執行的分析,用以提升翻譯程序執行的效率。這一類分析一般包括對「最優化」或代碼改進技術的討論。編程語言

這兩類分析也不是相互排斥的,由於與沒有正確性要求的語言相比,如靜態類型檢查這樣的正確性要求能使編譯程序產生更加有效的代碼。另外,值得注意的是,這裏討論的正確性要求永遠不能創建程序的徹底正確性,正確性僅僅是部分的。但這樣的要求仍然是有用的,能夠給編程人員提供一些信息,提升程序的安全性和有效性。函數

 

1.1 屬性和屬性文法

 屬性( attribute)是編程語言結構的任意特性。屬性在其包含的信息和複雜性等方面變化很大,特別是當它們能肯定時翻譯/執行過程的時間。優化

屬性直接與語言的文法符號相聯繫(終結符號或非終結符號) 。若是X是一個文法符號,a 是X的一個屬性,那麼咱們把與X關聯的a的值記做X.a。翻譯

屬性的典型例子有:blog

  • 變量的數據類型。
  • 表達式的值。
  • 存儲器中變量的位置。
  • 程序的目標代碼。
  • 數的有效位數。繼承

 

屬性文法:數學

如有一個屬性的集合a1 , . . . , ak ,語法制導語義的原理應用於每一個文法規則X0→X1 X2 . . . X n(這裏X0 是一個非終結符號,其餘的Xi 都是任意符號),每一個文法符號Xi 的屬性Xi .aj 的值與規則中其餘符號的屬性值有關。每一個關係用屬性等式(或語義規則)表示:編譯

  Xi .aj = fij (X0.a1 , . . . , X0.ak ,X1.a1 , . . . , X1.ak , . . . , Xn .a1 , . . . , Xn .ak )

這裏的 fij 是一個數學函數。屬性a1 , . . . , ak 的屬性文法(attribute grammar)是對語言的全部文法規則的全部這類等式的集合。

 

屬性文法的表格表示:

 

 

 

1.2 繼承屬性和綜合屬性

綜合屬性用於自下而上傳遞信息,繼承屬性用於自上而下傳遞信息。

相關文章
相關標籤/搜索