青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歲月流轉,往昔空明

C++博客 首頁 新隨筆 聯系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks
在進行靜態強類型語言的設計過程中,是一定需要提供一種語法實現變量和類型的關聯。這種語法一般稱之為 “聲明” 或者 “定義”。

如果用一種人類易讀的方式進行表達,可以寫作 define variable_name as type_name。沒有錯,你看到的這種形式類似于VB當中 Dim As的方法。在語法分析的過程中,這種方法的好處很明顯。define 作為提示字,意味著一個聲明或者定義的開始,as 則代表后續的Tokens都是用于一個類型的,這樣關鍵字可以很顯著的將語義區分開。

但是這種寫法并不方便。C 一類的語言,都選用一種 prefix declaration specifier 的方式,也就是我們常常見到的:type_name variable_name 這樣的形式。舉個最簡單的例子,int i;。如果有類型修飾,可以作為一個基本類型的前綴或者后綴出現。例如const int i; 或者 int const i; 至于修飾含義是左綁定還是右綁定,這個需要取決于語言本身的設計。

如果事情是這個樣子的話,也就沒什么好說的了。但是在C語言里面,有兩個例外:函數和數組。例如,在C里面定義一個數組,寫作:const int array[expr]; 這種寫法既不是前綴寫法,也不是后綴寫法。類型被變量兩分了。如果僅僅是一個數組定義,那也好辦,當做特殊情況處理就好了。
但是有時候我們的數組元素會變得非常復雜。 舉個例子,( struct {...} const [ constant ] identifier ( params... )  ) [ expr ]。你能理解這樣一個復雜的定義其實是一個函數的數組么?不僅僅是你不能,我想在撰寫語法規則的時候,又困難,又不合邏輯。

在C的EBNF中,這個問題解決起來也很復雜。
在這里,我們簡化一下C的語法,不考慮C的指針,不考慮變量初始化,不考慮類型修飾符,也不考慮一個類型定義多個變量的情況。
這就意味著你只能寫 int i; int j; j = 0; 而不能寫 int i, j = 0;

declaration ::= declaration_specifier declarator

declarator ::= identifier
               | delcarator '['  expr ']'
               | declarator '(' parameters_declaration_list ')'
               | '(' declarator ')'


那么我問你,declarator是個什么東西。變量名?不是。函數聲明?也不是。數組?也不是。declaration_specifier呢?變量類型?是。數組元素類型?是。函數返回值類型?也是。顯然這樣一個語法要素具備了太多的語義。更重要的是,沒到最后,你是沒法確定declaration_specifier究竟是一個什么含義,identifier所代表的,究竟是個什么東西。顯然只有在聲明匹配完成之后,還需要進行復雜的推導過程,才能確定變量的嵌套結構。

這個問題還導致了C語言里面的這么一個特性:那就是很出名的指針符號*的變量綁定性質。在C語言中,*,[],() 操作符并沒有理解為對類型的修飾,而是理解為對變量的修飾。這就讓我們必須要這么寫: int m[expr], n[expr]; int m( int, int ), n( int, float );
而對變量,寫法就成了: int x, y; 這導致了同樣的寫法兩者在語義上的不一致性。這也是為什么新手云里霧里的根本原因了。按照普通變量的規矩,函數應該寫成 int (x, y) (int);這樣的結構。好吧,這樣還挑戰不倒你。但是如果我更復雜一點,加上初始化呢?就變成了 int ( x = p0, y ) (int) 這樣的結構,呃。

為什么C會這么做?難道完全的前置類型會讓語法分析工作變難么?很顯然不會。雖然C語言如此聲明的出發點不可考,但是想讓普通類型和數組聲明維持同樣的語法結構是很簡單的事情,C#就給了一個很好的答案。在C#中,變量是如此聲明的:

declaration ::= declaration_specifier declarator
declaration_specifier ::= function_specifier | array_specifier | identifier
                          | '(' declaration_specifier ')'
function_specifier ::= declaration_specifier '(' parameter_declaration_list ')'
array_specifier ::= declaration_specifier '[' expression_list ']'


這樣,declaration_specifier完全就變成了類型,而declarator部分就和類型脫鉤了。在這種聲明方式中,我們就這么定義一個變量 int [] x, y, z; OK,這樣大家就理解了,x,y,z都是一個數組。而不會造成C語言當中的誤解。

最后討論一下類型修飾的問題。這里只討論單一類型的類型修飾,下面我們會看到,復合類型其實也是一樣的。我們將類型聲明和表達式進行類比,就可以將類型理解為變量,類型修飾理解為單目操作符。

const type  <==類比==>  ~var

const就相當于按位取反操作符~,type就相當于var。const type這個表達式的結果就是一個常量化的type。那么,我們可以更廣泛的將聲明理解成 type_expression variable_name 這樣的形式。type_expression在語義分析的時候進行類型演算得出結果,variable_name則利用類型表達式獲得真正的類型,并實例化。下面我們寫出type_expression的演算語法:

type_expression ::= type_identifier
                    | type_op type_expression  /* prefix  style */
                    | type_expression type_op  /* postfix style */
type_op ::= type_qualifier

當然,對于 const int volatile 這樣的聲明,這個表達式還有二義性。這個二義性可以通過一定的方法消除,這一點一般的編譯原理教材都有詳細的討論。并且,我們完全可以將()和[]也納入到type_operator中,這兩個操作一個可以構造出函數類型,一個構造出數組類型來,這樣類型問題就得到了一個遞歸一致的解決。

當然,更重要的是,我將type_expression variable_name這樣的聲明式變成typedef type_expression variable_name呢?

哈哈。

最后嚴重感謝一下VCZH,因為這小子吃了足夠的shit,我就可以不用繼續吃shit了。正所謂前人栽樹后人乘涼。

posted on 2009-02-25 01:33 空明流轉 閱讀(1989) 評論(2)  編輯 收藏 引用

評論

# re: 靜態強類型語言的類型聲明與變量聲明 2009-02-25 01:43 陳梓瀚(vczh)
囧  回復  更多評論
  

# re: 靜態強類型語言的類型聲明與變量聲明[未登錄] 2009-02-27 09:37 六水
哈哈,這句說的太經典了  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品免费在线| 欧美激情一区二区三级高清视频| 免费亚洲一区二区| 亚洲视频电影在线| 亚洲一区二区在线看| 欧美国产1区2区| 在线观看日韩国产| 亚洲电影毛片| 在线观看视频一区二区| 久久精品一区四区| 国产精品午夜国产小视频| 欧美福利精品| 欧美日韩在线视频首页| 欧美日韩一区在线视频| 欧美交受高潮1| 国产精品久久久久久久久婷婷 | 国产精品第十页| 久久久国产视频91| 欧美一区二区性| 久久精品人人| 欧美人交a欧美精品| 欧美人与禽猛交乱配视频| 一区二区三区久久精品| 亚洲午夜精品17c| 亚洲网站啪啪| 国产精品99一区| 新片速递亚洲合集欧美合集| 久久久999成人| 麻豆精品传媒视频| 99精品视频网| 欧美影院成年免费版| 久久激情婷婷| 欧美三级第一页| 国产日韩一区欧美| 99精品视频免费全部在线| 亚洲一级片在线观看| 你懂的网址国产 欧美| 亚洲日本免费| 免费中文字幕日韩欧美| 日韩一级成人av| 亚洲视频观看| 欧美肥婆bbw| 国产精品手机视频| 亚洲免费观看视频| 欧美一区二区三区播放老司机| 欧美一区二区日韩一区二区| 亚洲欧美国产一区二区三区| 久久国产欧美| 久久精品成人一区二区三区| 亚洲激情网址| 亚洲黄页一区| 久久一区中文字幕| 一区二区三区欧美视频| 香蕉久久夜色精品国产使用方法| 免费亚洲网站| 国产日韩欧美综合一区| 亚洲精品久久久一区二区三区| 狂野欧美一区| 噜噜噜久久亚洲精品国产品小说| 亚洲成在线观看| 久久精品国产99国产精品| 欧美精品午夜| 狠狠色香婷婷久久亚洲精品| 欧美在线3区| 亚洲免费精品| 欧美日韩三区四区| 亚洲国产成人精品女人久久久 | 性亚洲最疯狂xxxx高清| 免费看黄裸体一级大秀欧美| 亚洲午夜一区二区三区| 欧美成人免费视频| 狠狠色狠狠色综合日日tαg| 毛片av中文字幕一区二区| 香蕉精品999视频一区二区 | 国产亚洲一区在线播放| 亚洲国产精品va在线看黑人| 欧美国产亚洲视频| 久久精品亚洲一区二区| 一区二区视频免费在线观看| 午夜精品久久久久久久99水蜜桃 | 久久麻豆一区二区| 久久精品视频在线看| 国产视频一区二区三区在线观看| 亚洲欧美日韩一区在线| 先锋影音网一区二区| 国产精品一区二区你懂得| 亚洲免费在线看| 久久成人免费网| 黄色av一区| 亚洲国产精品一区| 欧美激情影音先锋| 在线亚洲欧美视频| 亚洲欧美日韩精品综合在线观看| 国产精品亚发布| 欧美不卡福利| 欧美激情片在线观看| 亚洲午夜精品久久| 久久精品中文字幕免费mv| 在线日韩视频| 一区二区三区.www| 国产精品毛片在线| 亚洲一二三四久久| 亚洲男人的天堂在线观看 | 亚洲国产天堂久久综合| 玖玖国产精品视频| 欧美成年人在线观看| 国内外成人免费激情在线视频网站| 欧美成人午夜视频| 男人天堂欧美日韩| 最新国产乱人伦偷精品免费网站 | 欧美久久久久免费| 久久精品国产亚洲a| 久久精品99久久香蕉国产色戒| 久色婷婷小香蕉久久| 麻豆精品一区二区av白丝在线| 亚洲精品一区二区三区樱花| 亚洲欧美日韩综合| 亚洲高清免费| 一区二区三欧美| 亚洲国产精品一区二区第一页 | 欧美亚洲午夜视频在线观看| 亚洲福利视频网站| 国产精品极品美女粉嫩高清在线 | 久久精品免费电影| 在线一区二区三区做爰视频网站| 欧美日韩你懂的| 久久中文在线| 欧美日韩国产成人高清视频| 蜜臀99久久精品久久久久久软件| 欧美精品色一区二区三区| 亚洲欧美国产77777| 欧美激情一区二区三区在线视频观看 | 亚洲第一色在线| 亚洲午夜精品一区二区| 99国产精品久久| 久久精品国产综合精品| 亚洲制服少妇| 国产精品jizz在线观看美国| 欧美成人激情在线| 欧美日韩一区二区欧美激情 | 午夜精品久久久久影视 | 欧美在线不卡| 午夜久久久久| 国产精品欧美在线| 欧美激情欧美狂野欧美精品| 欧美激情精品久久久久久大尺度| 韩国自拍一区| 午夜精品久久久久久久白皮肤| 欧美一区2区三区4区公司二百| 欧美日韩精品中文字幕| 曰本成人黄色| 亚洲欧美在线一区| 很黄很黄激情成人| 宅男噜噜噜66一区二区66| 亚洲精品免费电影| 久久精品一区四区| 欧美国产亚洲精品久久久8v| 国产主播一区二区三区| 久久久久久久精| 美女视频一区免费观看| 国产视频亚洲精品| 久久综合色婷婷| 欧美成人一区二区三区| 亚洲最新视频在线播放| 欧美激情网友自拍| 欧美一区二区三区在线视频| 国产在线视频欧美| 久久精品亚洲国产奇米99| 亚洲国产欧美在线| 亚洲人成毛片在线播放女女| 久久精品盗摄| 亚洲国产精品热久久| 99精品热视频| 国产日韩欧美综合| 久久精品亚洲一区二区三区浴池 | 亚洲第一中文字幕| 日韩亚洲一区在线播放| 国产精品综合网站| 欧美一区日韩一区| 久久综合九色综合网站| 夜夜嗨av色综合久久久综合网| 欧美三区在线视频| 亚洲综合社区| 免费试看一区| 欧美一区二区三区免费观看视频 | 在线亚洲欧美专区二区| 韩国一区电影| 欧美成人久久| 欧美夜福利tv在线| 免费在线成人| 激情久久久久久久久久久久久久久久| 亚洲欧美综合| 午夜综合激情| 日韩午夜在线电影| 欧美视频第二页| 在线视频欧美精品| 老司机午夜免费精品视频| 亚洲精品少妇30p| 国色天香一区二区| 欧美日韩国产成人在线91|