-
词法分析阶段的输入是:源程序
- 词法分析器以字符流形式的源程序作为输入,将其转换为有意义的词法单元(Token)。
-
括号不配对的错误会在:语法分析阶段被检查出
- 语法分析器负责验证程序的语法结构,括号配对属于语法规则的一部分。若括号不匹配(如缺少左括号或右括号),语法分析器会检测到结构错误并报告。
答案:
第一空:源程序
第二空:语法分析
-
词法分析阶段的输入
- 词法分析阶段的输入是源程序代码。源程序代码是用某种高级语言编写的程序,它是由字符序列组成的。词法分析器的任务是将源程序中的字符流分解成一个个的单词符号(也称为记号或词法单元)。例如,在C语言中,源程序代码中的关键字、标识符、常量、运算符等都是词法分析器需要识别的单词符号。比如源代码
int a = 10;
,词法分析器会将其分解为int
(关键字)、a
(标识符)、=
(运算符)、10
(常量)和;
(分隔符)等单词符号。
- 词法分析阶段的输入是源程序代码。源程序代码是用某种高级语言编写的程序,它是由字符序列组成的。词法分析器的任务是将源程序中的字符流分解成一个个的单词符号(也称为记号或词法单元)。例如,在C语言中,源程序代码中的关键字、标识符、常量、运算符等都是词法分析器需要识别的单词符号。比如源代码
-
括号不配对的错误检查阶段
- 若程序中的括号不配对,则会在语义分析阶段检查出错误。语义分析阶段的主要任务是对经过词法分析和语法分析后的程序进行语义检查,并收集类型信息。括号的配对问题不仅仅是语法结构的问题,还涉及到语义的完整性。例如,括号用于表示表达式的优先级、函数的参数列表等语义信息。如果括号不配对,会导致语义的混乱,比如表达式
a + (b * c
(缺少右括号)或者a + )b * c(
(括号顺序错误),语义分析阶段会检查到这种错误,因为它需要确保表达式的语义是正确的。 - 目标代码生成阶段会将中间代码转换为目标机器的可执行代码,具体形式包括以下几种:
- 若程序中的括号不配对,则会在语义分析阶段检查出错误。语义分析阶段的主要任务是对经过词法分析和语法分析后的程序进行语义检查,并收集类型信息。括号的配对问题不仅仅是语法结构的问题,还涉及到语义的完整性。例如,括号用于表示表达式的优先级、函数的参数列表等语义信息。如果括号不配对,会导致语义的混乱,比如表达式
-
汇编语言代码
- 生成与特定硬件架构(如x86、ARM)对应的汇编指令,需要通过汇编器进一步转换为机器码。
-
机器语言代码
- 直接生成二进制机器指令,可被计算机硬件直接执行,通常以目标文件(如
.o
、.obj
)形式存在。
- 直接生成二进制机器指令,可被计算机硬件直接执行,通常以目标文件(如
-
可重定位目标代码
- 生成的代码包含地址占位符,需要链接器将其与其他模块(如库文件)组合后才能形成完整的可执行程序。
关键点:
- 目标代码生成需考虑目标机器的硬件特性(如寄存器数量、指令集)和操作系统约束(如内存管理方式)。
- 生成的代码可能需要经过链接(Linking)步骤才能成为最终可运行的程序。
- 词法分析器识别关键字和标识符的过程主要依赖于模式匹配和符号表的使用。以下是具体的工作原理:
1. 模式匹配
-
定义模式:词法分析器首先需要定义关键字和标识符的模式。这些模式通常是通过正则表达式来描述的。
- 关键字:关键字是语言中预定义的、具有特殊含义的单词,例如
if
、while
、int
等。每个关键字都有一个固定的模式,即它本身的内容。 - 标识符:标识符是用户定义的名称,例如变量名、函数名等。它的模式通常是一个规则,例如以字母或下划线开头,后跟字母、数字或下划线的序列。例如,正则表达式
[a-zA-Z_][a-zA-Z0-9_]*
可以用来描述标识符的模式。
- 关键字:关键字是语言中预定义的、具有特殊含义的单词,例如
-
匹配过程:词法分析器从源代码中逐个读取字符,尝试将字符序列与预定义的模式进行匹配。
- 关键字匹配:词法分析器会将读取的字符序列与关键字表中的关键字逐一比较。如果完全匹配某个关键字,则识别为关键字。
- 标识符匹配:如果字符序列不符合关键字的模式,但符合标识符的正则表达式模式,则识别为标识符。
2. 符号表
- 存储和查询:符号表是一个数据结构,用于存储关键字和标识符的相关信息。
- 关键字:关键字通常在编译器初始化时被加载到符号表中,因为它们是固定的。
- 标识符:当词法分析器识别出一个新的标识符时,它会将其插入到符号表中,并记录其相关信息(如类型、作用域等)。
- 查询:在后续的分析过程中,词法分析器可以通过符号表快速查找某个单词是否已经被识别过,以及它的类型和属性。
3. 识别过程示例
假设源代码中有一段代码:
int a = 10;
- 读取字符:词法分析器从左到右逐个读取字符。
- 匹配关键字:
- 读取
i
,n
,t
,依次匹配,发现int
是一个关键字。 - 将
int
识别为关键字,并记录到符号表中(如果符号表中还没有int
)。
- 读取
- 匹配标识符:
- 读取空格后,继续读取
a
,发现它符合标识符的模式(以字母开头)。 - 继续读取后续字符,直到遇到
=
,确认a
是一个标识符。 - 将
a
插入符号表,并标记为标识符。
- 读取空格后,继续读取
- 处理其他字符:
- 继续读取
=
,识别为运算符。 - 读取
10
,识别为常量。 - 读取
;
,识别为分隔符。
- 继续读取
4. 总结
词法分析器通过模式匹配来识别关键字和标识符,同时利用符号表来存储和查询这些单词的属性。关键字的模式是固定的,而标识符的模式是通过正则表达式定义的。通过这种方式,词法分析器能够高效地将源代码中的字符序列分解为单词符号。