词法分析是编译原理中的一个重要环节,它主要负责从源程序中识别出一个个有意义的词汇单元,也就是所谓的单词符号,这些符号包括保留字、标识符、常数、运算符和分隔符等。在本实验中,我们将通过编程实现这一过程。
实验的目的在于让学生掌握词法分析的基本思想和方法,即根据源程序中的字符序列识别出单词符号,并生成相应的内部编码。例如,在C语言的源程序中,"main"是一个保留字,"a"和"b"可能是标识符,"10"是整型常数,"="是运算符,";"是分隔符。当遇到错误的字符或格式时,程序应能显示"Error"并跳过错误部分,继续进行分析。
实验的原理基于字符的分类和模式匹配。词法分析器通常会维护一个关键字表,如实验中的`key[]`,用于比较当前扫描到的字符序列是否为预定义的关键字。在这个实验中,关键字表包含了如"if"、"int"等常见的C语言关键字。词法分析器会根据输入的字符,结合已知的规则(如字母、数字、运算符等的组合),识别出单词符号,并生成对应的内部表示。
实验步骤分为三个阶段:设计程序所需的模块,如扫描、输出、错误处理等功能;编写各个模块的代码,实现字符的获取、拼接、判断等操作;通过主函数将这些模块整合,实现完整的词法分析功能。
在给出的程序代码示例中,可以看到使用了动态链表结构`struct Node`来存储单词符号,以及全局变量`ch`来暂存当前扫描到的字符。`getch()`函数用于读取字符,`concat()`用于字符拼接,`reserve()`用于判断是否为保留字,`retract()`则用于回退字符。在主函数`main()`中,通过循环读取用户输入的源代码,直到遇到以`#`开头的行表示输入结束。词法分析的核心函数`scaner()`则实现了实际的分析过程,输出结果包括单词的内部编码和自身值。
运行结果展示了一个简单的C语言源程序片段的词法分析过程。输入的源代码是定义两个整型变量`a`和`b`,并进行赋值的操作。输出的结果应该是对应单词符号的内部编码和自身值。
这个实验旨在让学生通过实践了解词法分析的过程,掌握如何编写词法分析器,并对C语言的源代码进行有效的解析。通过这样的实验,学生不仅能深入理解编译原理,还能提高编程和调试能力。