词法分析是编译器设计中的重要组成部分,其主要任务是从源代码中识别出有意义的词汇单元,也就是所谓的单词(token)。在这个实验报告中,词法分析器的设计目的是识别出编程语言中的基本保留字、标识符、常数、运算符和分隔符这五类单词。
1. 保留字表:
保留字是编程语言中预先定义好的有特殊含义的关键字,如报告中提到的`const`、`var`、`call`等。这些词不能作为变量名或标识符使用,因为它们在语法中有特定的作用。保留字表用于在词法分析过程中快速判断当前字符序列是否为保留字。
2. 符号表:
符号表是词法分析器中存储所有识别出的单词类型、属性和值的地方。例如,报告中列出了各种运算符(如`=`, `<`, `+`, `-`等)的类型和属性,还有标识符、常数等的分类。当识别到一个单词时,词法分析器会为其分配一个内部编码,并可能记录其自身值。
3. 状态转换图:
状态转换图是词法分析器的核心,它定义了从一个字符到下一个字符如何进行状态转换,以确定当前正在识别的单词类型。例如,报告中提到了标识符和数字的状态转换过程,以及关系运算符和分隔符的识别规则。这种图通常基于有限状态自动机(Finite State Automaton, FSA)的概念。
4. 错误处理:
当输入的字符流不符合预定义的规则时,词法分析器应能够进行错误处理。在这个实验中,如果遇到错误,程序会显示"Error !",然后跳过错误部分继续进行分析。
5. 环境与测试:
实验是在Windows XP环境下使用Visual C++ 6.0编译器进行的。为了验证词法分析器的正确性,提供了多个输入示例,包括不同类型的单词和表达式。通过比较预期输出与实际输出,可以确认词法分析器是否正确地识别了源代码中的单词。
源代码部分展示了实现词法分析器的基本结构,包括使用`getchar()`获取输入字符,`if`和`while`语句进行条件判断,以及字符数组来存储和识别单词。此外,还使用了`freopen()`函数重定向输入和输出,使得可以从文本文件读取输入并写入输出。
总结来说,这个实验报告详细介绍了词法分析器的设计与实现,包括保留字表、符号表、状态转换图、错误处理机制以及测试案例。这样的实践有助于深入理解编译原理中词法分析这一重要概念。