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

歲月流轉(zhuǎn),往昔空明

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks
在進(jìn)行靜態(tài)強(qiáng)類型語言的設(shè)計過程中,是一定需要提供一種語法實(shí)現(xiàn)變量和類型的關(guān)聯(lián)。這種語法一般稱之為 “聲明” 或者 “定義”。

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

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

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

在C的EBNF中,這個問題解決起來也很復(fù)雜。
在這里,我們簡化一下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是個什么東西。變量名?不是。函數(shù)聲明?也不是。數(shù)組?也不是。declaration_specifier呢?變量類型?是。數(shù)組元素類型?是。函數(shù)返回值類型?也是。顯然這樣一個語法要素具備了太多的語義。更重要的是,沒到最后,你是沒法確定declaration_specifier究竟是一個什么含義,identifier所代表的,究竟是個什么東西。顯然只有在聲明匹配完成之后,還需要進(jìn)行復(fù)雜的推導(dǎo)過程,才能確定變量的嵌套結(jié)構(gòu)。

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

為什么C會這么做?難道完全的前置類型會讓語法分析工作變難么?很顯然不會。雖然C語言如此聲明的出發(fā)點(diǎn)不可考,但是想讓普通類型和數(shù)組聲明維持同樣的語法結(jié)構(gòu)是很簡單的事情,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都是一個數(shù)組。而不會造成C語言當(dāng)中的誤解。

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

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

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

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

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

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

哈哈。

最后嚴(yán)重感謝一下VCZH,因?yàn)檫@小子吃了足夠的shit,我就可以不用繼續(xù)吃shit了。正所謂前人栽樹后人乘涼。

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

評論

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

# re: 靜態(tài)強(qiáng)類型語言的類型聲明與變量聲明[未登錄] 2009-02-27 09:37 六水
哈哈,這句說的太經(jīng)典了  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            狠狠色丁香婷婷综合| 欧美在线视频a| 亚洲欧美网站| 亚洲一区二区三区午夜| 亚洲一区精品电影| 亚洲欧美影院| 久久精品免费观看| 女主播福利一区| 欧美激情影音先锋| 一本色道久久| 欧美在线日韩精品| 欧美国产精品| 国产精品一区二区a| 在线激情影院一区| 一区二区三区日韩精品| 欧美一区二区视频97| 欧美va日韩va| 正在播放日韩| 久久综合狠狠综合久久综青草| 欧美风情在线| 国产色产综合产在线视频| 在线国产欧美| 欧美亚洲一区二区在线观看| 欧美成人一区二区三区| 亚洲色在线视频| 麻豆精品国产91久久久久久| 欧美午夜不卡| 亚洲精品1234| 久久精品欧美日韩| 亚洲剧情一区二区| 久久一区亚洲| 国产日韩欧美高清免费| 日韩一二在线观看| 国产伦精品一区二区三区免费 | 亚洲免费综合| 欧美大片免费| 欧美一区二区免费观在线| 欧美黄色网络| 激情欧美国产欧美| 欧美有码在线视频| 99天天综合性| 欧美国产亚洲另类动漫| 狠狠色丁香婷婷综合| 欧美亚洲在线视频| 一区二区精品国产| 欧美日韩高清在线观看| 最新亚洲激情| 欧美大片在线影院| 久久精品在线| 狠狠色综合播放一区二区| 久久av老司机精品网站导航| 99国产精品99久久久久久| 欧美~级网站不卡| 91久久精品国产91久久| 免费观看成人网| 欧美一区免费视频| 国产最新精品精品你懂的| 久久国产精品亚洲77777| 午夜精品短视频| 国产伦精品一区二区三区高清| 午夜精品成人在线| 欧美一级视频| 影音先锋亚洲电影| 蜜桃伊人久久| 欧美1级日本1级| 亚洲理论在线| 亚洲肉体裸体xxxx137| 美女日韩欧美| 亚洲精品色图| av成人免费在线| 国产精品免费久久久久久| 欧美一级久久久| 欧美一区二区在线| 亚洲二区视频在线| 亚洲国产一二三| 欧美日韩美女在线观看| 亚洲午夜三级在线| 午夜在线电影亚洲一区| 影音先锋久久| 亚洲精品免费网站| 国产精品婷婷| 欧美成人久久| 欧美视频一区二区| 久久三级视频| 欧美日产一区二区三区在线观看| 亚洲欧美日韩精品久久久久| 欧美在线视频观看免费网站| 亚洲国产欧美日韩精品| 亚洲精品中文字幕在线观看| 国产人久久人人人人爽| 免费久久99精品国产自在现线| 欧美精品一区二区三区一线天视频 | 欧美日韩三级一区二区| 欧美一区二区免费观在线| 久久精品国产久精国产一老狼| 亚洲精品国产精品乱码不99 | 欧美午夜片在线免费观看| 欧美在线中文字幕| 欧美成人dvd在线视频| 亚洲免费小视频| 久久午夜影视| 亚洲免费在线播放| 免费不卡欧美自拍视频| 性欧美18~19sex高清播放| 久久综合一区二区| 久久成人精品一区二区三区| 欧美精品色网| 麻豆成人精品| 国产欧美欧洲在线观看| 亚洲黄色av| 一区二区三区中文在线观看| 一区二区三区av| 亚洲激情黄色| 久久精彩免费视频| 午夜精品三级视频福利| 欧美久久视频| 亚洲第一网站免费视频| 国产综合视频在线观看| 亚洲欧美日韩人成在线播放| 亚洲午夜视频在线| 欧美日本亚洲韩国国产| 亚洲高清资源| 亚洲福利在线观看| 久久精品国产免费| 欧美在线视频免费观看| 国产精品多人| 夜夜精品视频一区二区| 夜夜嗨av色综合久久久综合网 | 久久国产乱子精品免费女| 亚洲欧美色一区| 欧美午夜一区| 一本一本久久a久久精品综合麻豆| 亚洲日韩欧美视频一区| 另类人畜视频在线| 欧美国产日韩一区二区三区| 在线播放中文字幕一区| 久久精品成人一区二区三区蜜臀| 欧美在线一二三四区| 国产三级精品在线不卡| 欧美在线首页| 狼狼综合久久久久综合网 | 韩国三级电影一区二区| 久久久精品国产免费观看同学| 久久精品一区二区三区不卡牛牛 | 国产一区999| 久久精品国产一区二区三| 亚洲电影毛片| 久久天堂精品| 亚洲国产成人在线| 99视频有精品| 欧美日韩一区二区在线视频| 一本色道久久综合亚洲精品不 | 性色av一区二区三区红粉影视| 欧美性理论片在线观看片免费| 亚洲一区二区不卡免费| 久久精品青青大伊人av| 在线激情影院一区| 欧美日韩精品中文字幕| 亚洲一区二区精品在线| 欧美中文在线免费| 在线看成人片| 欧美日韩亚洲激情| 亚洲欧美视频在线观看| 女同性一区二区三区人了人一| 亚洲精品社区| 国产精品亚洲一区二区三区在线| 久久黄色影院| 日韩视频在线一区| 久久国产手机看片| 亚洲激情在线激情| 国产精品欧美久久| 免费成人高清视频| 亚洲字幕一区二区| 亚洲国产欧美日韩| 欧美在线一级视频| 亚洲人人精品| 国产欧美一区二区精品秋霞影院| 久久久久在线观看| 在线亚洲电影| 亚洲大片免费看| 欧美在线啊v| 日韩视频免费观看高清在线视频 | 一区二区高清视频| 国语自产在线不卡| 国产精品成人一区二区网站软件| 久久精品国产99国产精品澳门| 亚洲免费精品| 亚洲国产岛国毛片在线| 久久国产精品久久精品国产| 一区二区欧美亚洲| 亚洲国产美国国产综合一区二区| 国产日本亚洲高清| 国产精品国产三级国产专播精品人 | 西瓜成人精品人成网站| 亚洲国产综合在线看不卡| 国产精品一二三四区| 欧美日韩另类在线| 欧美肥婆bbw| 久久午夜国产精品| 欧美在线播放一区|