单词的词法分析程序设计
1 实验题目
对于给定的源程序(如 C 语言或 Pascal 等),要求从组成源程序的字符行中
寻找出单词,并给出它们的种别和属性——输出二元组序列。以便提供给语法分
析的时候使用。要求能识别所有的关键字,标志符等,并且能够对出先的一些词
法规则的错误进行必要的处理。
2 实验内容和要求
1. 给出语言的词法规则描述
2. 要求识别标识符、关键字、整常数、字符常数、浮点常数等
3. 要求能识别单界符:+,-,÷,×,:等符号
4. 双界符:/*,:=,等
5. 要求完成一些相关的辅助任务。一个任务实滤掉源程序中的注释、空格、
制表符、换行符;另一个任务是使编译器能够将发现的错误信息与源程序的出错
位置联系起来,以及错误的类型等。
3 待分析的词法文件
文件名称为:C:\1.txt (分析结果见 7:程序结果)
4 实验分析与设计过程
实验分析与设计过程
1. 实验说明
分析语言的选择:由于对 C 语言比较熟悉,我选择分析的程序为 C 语言
编写的程序。
2. 词法分析器的功能以及输出形式分析
1) 功能:
i. 对于输入的 C 源程序,输出单词符号 ,把相应的源程序的字符串转
换成单词符号的序列。
ii. 保存符号表,为所有的标识符建立一个符号表,以便于在语法和语义
分析的时候使用。
iii. 错误输出与提示
2) 结果输出形式:
i. 对于 token 用二元组输出,
ii. 符号表可以单独输出到文件中
iii. 错误输出到界面即可
3. 单词符号的表示
各种关键字(保留字、基本字),各种运算符、各种分界符,都用一个种别
码来标识。例:关键字 break、 保留字 asm、运算符”+”、在源程序中 1,2,3 表
示。 即所规定得到的中别码对应的词法描述为:
1 为关键字
3 为常数
2 为标志符
4 为运算符或界符
5 算法描述
由于这是一个用高级语言编写一个词法分析器,使之能识别输入串,并把分析
结果(单词符号,标识符,关键字等等)输出.输入源程序,输入单词符号,本词法分析
器可以辨别关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源
程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词
法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就
从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调用预
处理子程序来处理新串.
编写的时候,使用了文件的输入和输出,以便于词法分析的通用型,同时
在文件输出时,并保存在输出文件 output 文件中。
从左到右扫描程序,通过初始化:1 为关键字; 2 为标志符;
3 为常数 ; 4 为运算符或界符。
扫描过程如下:
1.指针扫描所打开的文件首,如果是字母开始处理字符关键字或者标识符
2.为单字符运算、限界符,写入输出文件并将扫描文件指针回退一个字符;
3.为双字符运算、限界符,写输出文件;
4.读入的下一个字符为文件结束符;
5.只考虑是否为单字符运算、限界符,若是,写输出文件
6 程序框图如下
Main
输 入 正 确 的
文件路径
文件路径正确
初始化打开文件
扫描指针*fp
若指针不为空
While(1)
Enter q/Q to quit
退出(exit)
初始化函数
(各个分析表)
调用扫描 scanner
指针*fp 指针指向
output(输出结果
保存的文件)中
判 断 fp 是 否 指
向文件的末尾
每扫描一个,用一个*fp
执政写入一个二元组进
入 output
*fp 扫描指针后移
7 程序结果如下(源程序见磁盘)
8 实验感想
词法分析是编译的第一个阶段,它的主要任务是从左至右扫描整个程序的
每个字符,将源程序变换为单词序列,以其内部的表示形式提供给语法分析的各
阶段。而做这个实验是使用的是 c 语言,并没有使用自动生成的词法分析器 LEX,
但是在做这个实验的时候参考了相关的书籍之后,使用文件打开,并保存输出结
果的方式,这样比较能够使程序的通用性加强,同时作为刚开始接触到编译的前
端的我,发现了自己还有许多的不足之处。为了以后的语法分析能够结构更加的
明晰,那么就必须认真的研读老师所给的相关资料,同时要学会分析较完整定义
的相关文法,使之更为直接明了。这个实验主要花费的时间,并不是在于词法分
析即源文件中的 scan 扫描程序阶段,而是在设置文件的出错以及输出,输入阶
段,这也说明在原来学习文件调用打开的时候并没有很熟练的运用文件之间的调
用的相关操作,这也提醒我在今后学习语言的过程中要细致,要实践。