词法分析是编译原理中的一个重要环节,它的主要任务是对源程序进行初步处理,将源代码按照编程语言的规则分解成一系列有意义的单词符号。这些单词符号是程序语言的基本语法单位,它们包括关键字、标识符、常数、运算符和界符等。
1. 关键字:是编程语言中预定义并具有特殊含义的标识符,例如Pascal中的`begin`、`end`和`if`。关键字的含义是固定的,并且数量在语言定义时就已经确定。
2. 标识符:标识符用于表示变量、数组、函数等名称,可以是用户自定义的任意合法字符组合,数量理论上是无限的,只要遵循编程语言的命名规则。
3. 常数:常数包括整型、实型、布尔型和字符型等,它们是程序中表示固定数值的元素,如数字5、小数3.14或文本'Hello'。
4. 运算符:如加减乘除(+、-、*、/)以及比较运算符(==、!=、<、>等),它们控制着计算和逻辑操作。
5. 界符:界符包括逗号、分号、括号等,它们在源程序中起到分隔和组织作用,如区分语句、表达式等。
词法分析器,又称为扫描器,负责执行这个过程。它通常从源程序的左端开始,逐个读取字符,通过识别模式来识别出单词符号。识别的结果是以二元式的形式表示,即每个单词符号由它的种类和值两部分组成。种类可能用整数值表示,如1代表关键字,2代表标识符等。值部分可能是常量的二进制表示,也可能是符号表中的地址码。
以FORTRAN编译程序的词法分析为例,输入串`IF (5·EQ·M) GOTO 100`会被转化为一系列的单词符号,每个单词符号都有相应的编码和值。同样,C++代码段`while (i >= j) i--;`经过词法分析后,也会被转换为一系列的单词符号,其中`id`表示标识符,`>=`表示运算符,而`while`这样的关键字也会有特定的编码。
将词法分析独立出来的好处包括:
- 结构化:使编译程序的结构更清晰,便于理解和维护。
- 效率提升:词法分析和语法分析使用不同的方法,词法分析可以通过正则文法自动生成,简化实现。
- 灵活性:可以对词法分析进行优化,甚至为不同的输入使用不同的词法分析器,以便得到更有效的内部表示。
词法分析器可以作为一个单独的阶段,即作为编译过程的一遍,或者作为子程序嵌入到其他阶段中。无论哪种方式,其目标都是将源程序转化为更便于进一步语法分析的单词符号串,为后续的编译步骤打下基础。