第1章 词法陷阱

当我们读一个句子时,我们通常不会去想组成一个单词的单个字母的意思。实际上,字母自己所表达的意义很少:我们把他们组成单词,并且给这些单词赋予一定的意义。

对于C程序和其他语言的程序也是如此。单个字符并不表达任何意义,只在和上下文联系起来后,他们才有意义。因此,在:

  1. p->s = "->";

里,两个-代表两个不同的意义。更准确地说,两个-各是不同的符号(token)的一部分,第一个是->中的一部分,第二个则是字符串的一部分。此外,->和组成它的两个字符都有完全不同的含义。

token代表程序中这样的一个部分:它在语句中作为一个单词总是扮演同样的角色,在感觉上,它每次出现时都是表达相同的含义。同样的字符序列可以在一个上下文中属于一个token,而在另一个上下文中又属于完全不同的另一个token。编译器中把一个程序分割成token的部分通常叫做词法分析器

另一个例子,考虑下面的语句:

  1. if (x > big) big = x;

这个语句中第一个token是if,一个关键字。第二个token是左括号,然后是标识符x、大于号、标识符big……在C中,我们可以在token间添加多余的空格(还有Tab、换行符)等,所以我们还可以这样写:

  1. if
  2. (
  3. x
  4. >
  5. big
  6. )
  7. big
  8. =
  9. x
  10. ;

本章将会探究对于token含义的常见的误解,以及token和组成它的字符间的关系。