effective hierarchy(一) 之基本概念(1)

我告诫自己,不要忽略简单的东西,又要扎实。所以这一篇开始,专门来研究下C#基本概念。

 

MSDN: 词法结构(lexical structure)

 

程序(program)

C#程序包含了一个或多个源文件,叫做编译单元。源文件是由有序的统一字符(Unicode)序列组成。源文件与文件系统中的文件一一对应,但这种对应不是必须的。如果考虑便携(portability)最大化,建议使用UTF-8编码。

 

从概念上讲,程序使用三个步骤进行编译:

 

一、转换(transformation),把文件从一个特定的字符指令集和编码大纲(encoding scheme)转换成unicode字符序列;

 

二、词法分析(lexical analysis),把流式Unicode输入字符翻译成流式标记(token);

 

    1.C#源文件的词法结构五种基本元素构成,即行结束符、空白、注释、标记(token)和预处理指令:标记在程序的句法语法(syntactic grammar)中有重要意义;结束符、空白、注释用于分隔标记(separate tokens),预处理指令跳过源文件的节(section);

   

        (1)行结束符包括回车符(carriage return)、换行符(line feed)、回车换行符、行分隔符(line separator)、段分隔符(paragraph separator)

 

        (2)空白包括任何含unicode Zs类的字符、水平及垂直制表符(tab)、换页符(form feed)

 

        (3)注释包括单行注释和定界注释(delimited);注释不能嵌套;在字符和字符串文本内不处理注释;

 

        (4)标记包括标识符(identifier)、关键字、文本(literal)、运算符(operator)和标点:

 

          a.关键字

abstractasbaseboolbreakbytecase
catchcharcheckedclassconstcontinuedecimal
defaultdelegatedodoubleelseenumevent
explicitexternfalsefinallyfixedfloatfor
foreachgotoifimplicitinintinterface
internalislocklongnamespacenewnull
objectoperatoroutoverrideparamsprivateprotected
publicreadonlyrefreturnsbytesealedshort
sizeofstackallocstaticstringstructswitchthis
throwtruetrytypeofuintulongunchecked
unsafeushortusingvirtualvoidvolatilewhile

 

          b.文本,值的源代码表现,如布尔、字符、字符串、空、整数、实数

 

          c.运算符和标点

                 {      }      [       ]        (       )       .       ,      :       ;

       +      -      *       /       %      &       |       ^      !       ~

       =      <     >       ?      ++      --      &&      ||      <<      >>

       ==   !=    <=      >=      +=    -=     *=      /=      %=      &=

       |=    ^=    <<=   >>=   ->  

 

        (5)预处理器指令,提供按条件跳过源代码的节、报告错误和警告条件,以及分界源代码不同区域的能力

 

              a. #define和#undef,分别用于定义和取消定义有条件编译符号

              #if、#elif、#else和#endif,用于有条件跳过源代码的节(section) 

                  #line,用于控制产生错误和警告信息的行号

              #error和#warning,用于发布错误和警告

              #region和#endregion,用于显式标记源代码的节

 

              b.预处理指令总是占用源代码中单独的一行,并且以#符号开始,附以预处理器指令名

 

              c.#字符前及#与指令间可以有空字符

 

              d.包含#define, #undef, #if, #elif, #else, #endif, 或#line 的源代码行可以用单行注释结束,但不能使用/*..*/

 

              e.预处理指令既不是标记,也非句法语法的一部分,但可以用来包括或排除标记(token)序列,且以此影响程序的含义

  

//以下两者词法(语法)虽不同,但句法(语法)相同
#define A
#undef B
class C
{
#if A
   void F() {}
#else
   void G() {}
#endif
#if B
   void H() {}
#else
   void I() {}
#endif
}

class C
{
   void F() {}
   void I() {}
}

 

 2.c#源文件的词法处理就是把文件缩并为标记序列,作为词法分析的输入(input);除此之外,这些词法元素对句法结构没有影响。

 

 3.当多个词法语法生成(production)都能匹配一个源文件中的字符序列时,C#不会产生歧义,这是因为词法语法总是优先构成尽可能最长的词法元素。如'//'字符序列被作为单行注释的开始来处理,因为它的长度比单一的'/'指令标记要长(longer than a single / token)。

 

三、句法分析(syntactic analysis),把流式标记翻译成可执行代码。

 

小结:

 

编译有三个步骤,分别是转换、词法分析和句法分析。

词法分析中最重要的是“标记”(注意,不是标识,标识是标记中的一种);预处理也是词法的重要组成。

标记中最重要的是关键字和运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值