编译程序第一步:词法分析做了什么

编译时,在语法分析前会先进行词法分析。词法分析就是根据用户定义的规则,进行简单的词法单元替换。这个过程由预处理器(preprocessor)执行。

需要说明的是 iOS 开发中预处理器是定义在 C 语言中的,所以预处理器在处理源文件时不能识别 OC 代码。

映射字符集

C 语言最初并不是作为国际编程语言设计的,字符的选择基本都是基于标准的美国键盘。有些键盘没有 C 中使用的所有符号(法语区),因此 C 提供了一些由是三个字符组成的序列作为这些符号的替换表示。

如果有代码是这样的:

  • ??=include <stdio.h>

经过转换后会变成这样:

  • #include <stdio.h>

后来发觉三字符有点笨拙,C99 提供了双字符,可以用来替换某些标准 C 标点符号。

但是这并不是这个过程中全部的内容。多字节字符串可以用在字符串中,但是不能用在标识符中。C99 还新增了通用字符名(UCN),允许用户在标识名中使用扩展字符集中的字符。有两种表示方法:\u00F6\U00F6

物理行拼接(Line splicing)

有时为了代码阅读方便会手动给源码添加换行,比如下面的例子:

  • - (void)netServiceBrowerWillSearch:(NSNetServiceBrowser *)sb
  • didFindService:(NSNetService *)ns
  • moreComing:(Bool)moreComing{
  • // something
  • }

其实这个方法名在逻辑上是同一行代码,但是在文件里分成了几行展示。所以这个过程会把表示换行的换行符删除,转换成一个逻辑行。但是这里指的是按照回车键产生的换行,不包括显示表示换行的 \n

Token转换(Tokenization)

这个过程比较简单,就是把文本区分为预处理记号序列、空白序列和注释序列。接着使用空格替换空白和注释序列。

top Created with Sketch.