在本实验中,我们主要探讨的是词法分析程序的设计与实现,这是编译原理中的一个重要环节。词法分析,也称为扫描,是编译器的第一步,它的目标是从源代码中识别出有意义的符号,即单词符号(Token),并将它们分类。这个过程涉及到了正规表达式、字符串匹配和符号表管理等多个概念。
我们要明确实验的目标:设计一个词法分析程序,用于处理一种简单的语言,该语言包含了关键字、运算符、界符、标识符和整型常数。关键词包括"begin", "if", "then", "while", "do" 和 "end",所有这些关键词都以小写形式出现。运算符包括基本的算术运算符(+、-、*、/)以及关系运算符(<、<=、>=、>、=、#)。标识符(ID)遵循正规式 "letter(letter|digit)*",整型常数(NUM)则遵循 "digit digit*"。空格(包括空白、制表符和换行符)在词法分析阶段会被忽略。
在算法思想方面,词法分析程序的主要任务是识别出单词符号,并分配相应的种别码。算法从源程序的字符串表示开始,根据遇到的第一个字符来判断单词符号类型。如果遇到的是关键字,就查找关键字种别码表,得到相应的种别码;如果是运算符,根据运算符给出对应的种别码;如果是标识符或数字,则拼接成完整单词。在整个过程中,程序会跳过空格和换行符。如果遇到无法识别的字符,程序将报错。
实验的具体实现中,我们看到一个名为`scaner()`的函数,它是词法分析的核心。在这个函数中,首先清空了用于存储单词符号的数组`token`,然后开始从源代码字符串`prong`中读取字符。通过循环过滤掉空格和换行符,接着判断字符类型。如果遇到字母,程序将进入标识符处理逻辑,使用`strcmp()`函数对比关键词表,如果匹配到关键词,更新种别码。如果遇到数字,程序将进行数字串的累加计算。在识别过程中,如果遇到非预期的字符,程序会报错。
程序代码中,还定义了一些辅助变量,如`syn`用于存储种别码,`p`用于跟踪源代码中的位置,`m`和`n`用于处理字符串,`sum`用于构建数字。`rwtab[]`是一个字符串数组,用于存储关键词。整个过程展示了如何将理论知识转化为实际的代码实现。
这个实验提供了一个理解和实践词法分析的平台,通过编写和调试词法分析程序,可以更深入地理解编译原理中的词法分析部分,以及如何利用编程语言实现这些抽象的理论概念。同时,实验过程中的心得体验也能帮助我们更好地理解和反思所学知识,提升问题解决能力。