網(wǎng)站開(kāi)發(fā)公司賺錢(qián)嗎電腦清理軟件十大排名
程序
C# 程序 (program) 由一個(gè)或多個(gè)源文件 (source file) 組成,源文件的正式名稱是編譯單元 (compilation unit)。源文件是有序的 Unicode 字符序列。
源文件與文件系統(tǒng)中的文件通常具有一對(duì)一的對(duì)應(yīng)關(guān)系,但這種對(duì)應(yīng)關(guān)系不是必需的。為實(shí)現(xiàn)可移植性的最大化,建議這些文件在文件系統(tǒng)中應(yīng)按 UTF-8 編碼規(guī)范編碼。
從概念上講,程序的編譯分三個(gè)步驟:
1> 轉(zhuǎn)換 : 這一步將用特定字符指令系統(tǒng)和編碼方案編寫(xiě)的文件轉(zhuǎn)換為 Unicode 字符序列
2> 詞法分析 : 這一步將 Unicode 輸入字符流轉(zhuǎn)換為標(biāo)記流
3> 句法分析 : 這一步將標(biāo)記流轉(zhuǎn)換為可執(zhí)行代碼
文法
本規(guī)范采用兩種文法 (grammar) 來(lái)表示 C# 編程語(yǔ)言的語(yǔ)法 (syntax)。
詞法文法 (lexical grammar)規(guī)定怎樣將 Unicode 字符組合成行結(jié)束符、空白、注釋、標(biāo)記和預(yù)處理指令等。
句法文法 (syntactic grammar)規(guī)定如何將那些由詞法文法產(chǎn)生的標(biāo)記組合成 C# 程序。
1> 文法表示法
詞法文法和句法文法用文法產(chǎn)生式 (grammar production) 來(lái)表示。每個(gè)文法產(chǎn)生式定義一個(gè)非結(jié)束符號(hào)和它可能的擴(kuò)展(由非結(jié)束符或結(jié)束符組成的序列)。在文法產(chǎn)生式中,non-terminal 符號(hào)顯示為斜體,而 terminal 符號(hào)顯示為等寬字體。
文法產(chǎn)生式的第一行是該產(chǎn)生式所定義的非結(jié)束符號(hào)的名稱,后跟一個(gè)冒號(hào)。每個(gè)后續(xù)的縮進(jìn)行列出一個(gè)可能的擴(kuò)展,它是以非結(jié)束符或結(jié)束符組成的序列的形式給出的。
例如,產(chǎn)生式:
while-statement:while(boolean-expression) embedded-statement
定義了一個(gè) while-statement,它是這樣構(gòu)成的:由標(biāo)記 while 開(kāi)始,后跟標(biāo)記“(”、boolean-expression、標(biāo)記“)”,最后是一個(gè) embedded-statement。
當(dāng)有不止一個(gè)可能的非結(jié)束符號(hào)擴(kuò)展時(shí),列出這些可能的擴(kuò)展(每個(gè)擴(kuò)展單獨(dú)占一行)。
例如,產(chǎn)生式:
statement-list:statementstatement-list statement
定義一個(gè) statement-list,它或僅含有一個(gè) statement,或由一個(gè) statement-list 和隨后跟著的一個(gè) statement 組成。換言之,定義是遞歸的,語(yǔ)句列表由一個(gè)或多個(gè)語(yǔ)句組成。
一個(gè)符號(hào)若以下標(biāo)“[opt]”作其后綴,就表明該符號(hào)是可選的。
產(chǎn)生式:
block:{ statement-list[opt] }
是以下產(chǎn)生式的簡(jiǎn)短形式:
block:{ }{ statement-list }
它定義了一個(gè) block,此塊由一個(gè)用“{”和“}”標(biāo)記括起來(lái)的可選 statement-list 組成。
可選項(xiàng)通常在單獨(dú)的行上列出,但是當(dāng)有許多可選項(xiàng)時(shí),可以在單行上給定的擴(kuò)展列表之后加上短語(yǔ)“之一”。這只是在單獨(dú)一行上列出每個(gè)可選項(xiàng)的簡(jiǎn)短形式。
例如,產(chǎn)生式:
real-type-suffix: one ofF f D d M m
是以下產(chǎn)生式的簡(jiǎn)短形式:
real-type-suffix:FfDdMm
2> 詞法文法
詞法文法的結(jié)束符號(hào)為 Unicode 字符集的字符,并且詞法文法指定如何組合字符以構(gòu)成標(biāo)記、空白、注釋和預(yù)處理指令。
C# 程序中的每個(gè)源文件都必須符合詞法文法的 input 產(chǎn)生式。
3> 句法文法
句法文法的結(jié)束符號(hào)是由詞法文法定義的標(biāo)記,句法文法指定如何組合這些標(biāo)記以構(gòu)成 C# 程序。
C# 程序中的每個(gè)源文件都必須符合句法文法的 compilation-unit 產(chǎn)生式。
語(yǔ)法分析
input 產(chǎn)生式定義 C# 源文件的詞法結(jié)構(gòu)。C# 程序中的每個(gè)源文件都必須符合此詞法文法產(chǎn)生式。
input:input-section[opt]
input-section:input-section-partinput-section input-section-part
input-section-part:input-elements[opt] new-linepp-directive
input-elements:input-elementinput-elements input-element
input-element:whitespacecommenttoken
C# 源文件的詞法結(jié)構(gòu)由五個(gè)基本元素組成:行結(jié)束符、空白、注釋、標(biāo)記和預(yù)處理指令。在這些基本元素中,只有標(biāo)記在 C# 程序的句法文法中具有重要意義。
對(duì) C# 源文件的詞法處理就是將文件縮減成標(biāo)記序列,該序列然后即成為句法分析的輸入。行結(jié)束符、空白和注釋可用于分隔標(biāo)記,預(yù)處理指令可導(dǎo)致跳過(guò)源文件中的某些節(jié),除此之外這些詞法元素對(duì) C# 程序的句法結(jié)構(gòu)沒(méi)有任何影響。
當(dāng)有若干詞法文法產(chǎn)生式與源文件中的一個(gè)字符序列匹配時(shí),詞法處理總是構(gòu)成盡可能最長(zhǎng)的詞法元素。例如,字符序列 // 按單行注釋的開(kāi)頭處理,這是因?yàn)樵撛~法元素比一個(gè) / 標(biāo)記要長(zhǎng)。
1> 行結(jié)束符
行結(jié)束符將 C# 源文件的字符劃分為行。
new-line:Carriage return character (U+000D)Line feed character (U+000A)Carriage return character (U+000D) followed by line feed character (U+000A)Next line character (U+0085)Line separator character (U+2028)Paragraph separator character (U+2029)
為了與添加文件尾標(biāo)記的源代碼編輯工具兼容,并能夠以正確結(jié)束的行序列的形式查看源文件,下列轉(zhuǎn)換按順序應(yīng)用到 C# 程序中的每個(gè)源文件:
<1> 如果源文件的最后一個(gè)字符為 Control-Z 字符 (U+001A),則刪除此字符。
<2> 如果源文件非空并且源文件的最后一個(gè)字符不是回車符 (U+000D)、換行符 (U+000A)、行分隔符 (U+2028) 或段落分隔符 (U+2029),則將在源文件的結(jié)尾添加一個(gè)回車符 (U+000D)。
2> 注釋
支持兩種形式的注釋:?jiǎn)涡凶⑨尯蛶Х指舴淖⑨尅涡凶⑨?(Single-line comment) 以字符 // 開(kāi)頭并延續(xù)到源行的結(jié)尾。帶分隔符的注釋 (Delimited comment) 以字符 /* 開(kāi)頭,以字符 */ 結(jié)束。帶分隔符的注釋可以跨多行。
comment:single-line-commentdelimited-comment
single-line-comment:// input-characters[opt]
input-characters:input-characterinput-characters input-character
input-character:Any Unicode character except a new-line-character
new-line-character:Carriage return character (U+000D)Line feed character (U+000A)Next line character (U+0085)Line separator character (U+2028)Paragraph separator character (U+2029)
delimited-comment:/* delimited-comment-text[opt] asterisks /
delimited-comment-text:delimited-comment-sectiondelimited-comment-text delimited-comment-section
delimited-comment-section:/asterisks[opt] not-slash-or-asterisk
asterisks:*asterisks *
not-slash-or-asterisk:Any Unicode character except / or *
注釋不嵌套。字符序列 /* 和 / 在 // 注釋中沒(méi)有任何特殊含義,字符序列 // 和 / 在帶分隔符的注釋中沒(méi)有任何特殊含義。
在字符和字符串內(nèi)不處理注釋。
下面的示例:
/* Hello, world programThis program writes “hello, world” to the console
*/
class Hello
{static void Main(){System.Console.WriteLine("hello, world");}
}
演示了若干單行注釋。
3> 空白
空白被定義為任何含 Unicode 類 Zs 的字符(包括空白字符)以及水平制表符、垂直制表符和換頁(yè)符。
whitespace:Any character with Unicode class ZsHorizontal tab character (U+0009)Vertical tab character (U+000B)Form feed character (U+000C)
標(biāo)記
有幾類標(biāo)記:標(biāo)識(shí)符、關(guān)鍵字、文本、運(yùn)算符和標(biāo)點(diǎn)符號(hào)??瞻缀妥⑨尣皇菢?biāo)記,但它們可充當(dāng)標(biāo)記的分隔符。
token:identifierkeywordinteger-literalreal-literalcharacter-literalstring-literaloperator-or-punctuator
1> Unicode 字符轉(zhuǎn)義序列
Unicode 字符轉(zhuǎn)義序列表示一個(gè) Unicode 字符。Unicode 字符轉(zhuǎn)義序列在標(biāo)識(shí)符、字符和規(guī)則字符串中處理。不在其他任何位置處理 Unicode 字符轉(zhuǎn)義(例如,在構(gòu)成運(yùn)算符、標(biāo)點(diǎn)符號(hào)或關(guān)鍵字時(shí))。
unicode-escape-sequence:\u hex-digit hex-digit hex-digit hex-digit\U hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit
Unicode 轉(zhuǎn)義序列表示由“\u”或“\U”字符后面的十六進(jìn)制數(shù)字構(gòu)成的單個(gè) Unicode 字符。由于 C# 在字符和字符串值中使用 Unicode 代碼點(diǎn)的 16 位編碼,因此從 U+10000 到 U+10FFFF 的 Unicode 字符不能在字符中使用,在字符串中則用一個(gè) Unicode 代理項(xiàng)對(duì)來(lái)表示。不支持代碼數(shù)據(jù)點(diǎn)在 0x10FFFF 以上的 Unicode 字符。
不執(zhí)行多次轉(zhuǎn)換。例如,字符串文本“\u005Cu005C”等同于“\u005C”,而不是“\”。Unicode 值 \u005C 是字符“\”。
下面的示例:
class Class1
{static void Test(bool \u0066){char c = '\u0066';if (\u0066){System.Console.WriteLine(c.ToString());}}
}
演示了 \u0066(它是字母“f”的轉(zhuǎn)義序列)的一些用法。該程序等效于:
class Class1
{static void Test(bool f){char c = 'f';if (f){System.Console.WriteLine(c.ToString());}}
}
2> 標(biāo)識(shí)符
本節(jié)給出的標(biāo)識(shí)符規(guī)則完全符合 Unicode 標(biāo)準(zhǔn)附件 31 推薦的規(guī)則,但以下情況除外:允許將下劃線用作初始字符(這是 C 編程語(yǔ)言的傳統(tǒng)),允許在標(biāo)識(shí)符中使用 Unicode 轉(zhuǎn)義序列,以及允許“@”字符作為前綴以使關(guān)鍵字能夠用作標(biāo)識(shí)符。
identifier:available-identifier@ identifier-or-keyword
available-identifier:An identifier-or-keyword that is not a keyword
identifier-or