记号化(tokenization)即将输入字符串分割为记号、进而将记号进行分类的过程。生成的记号随后便被用来进行语法分析。
例如对于如下字符串:
The quick brown fox jumps over the lazy dog
计算机并不知道这是以空格分隔的九个英语单词,只知道这是普通的43个字符构成的字符串。可以通过一定的方法(这里即使用空格作为分隔符)将语素(这里即英语单词)从输入字符串中分割出来。分割后的结果用XML可以表示如下:
然而,语素只是一类字符构成的字符串(字符序列),要构建记号,语法分析器需要第二阶段的评估器(Evaluator)。评估器根据语素中的字符序列生成一个“值”,这个“值”和语素的类型便构成了可以送入语法分析器的记号。一些诸如括号的语素并没有“值”,评估器函数便可以什么都不返回。整数、标识符、字符串的评估器则要复杂的多。评估器有时会抑制语素,被抑制的语素(例如空白语素和注释语素)随后不会被送入语法分析器。
例如对于某程序设计语言的源程序片段:
net_worth_future = (assets - liabilities);
在进行语法分析后可能生成以下单词流(空格被抑制):
NAME "net_worth_future"
EQUALS
OPEN_PARENTHESIS
NAME "assets"
MINUS
NAME "liabilities"
CLOSE_PARENTHESIS
SEMICOLON
尽管在某些情况下需要手工编写词法分析器,一般情况下词法分析器都用自动化工具生成。