词法分析实验
一、实验目的
编制一个词法分析程序
二、实验内容和要求
1.输入:源程序字符串
2.输出:二元组(种别,单词本身)
单词与种别码
三、实验方法、步骤及结果测试
(一).原理分析及流程图
1.原理分析
存储结构:此词法分析程序,我采用的主要存储结构有链队列和指针数组。链队列用于存 储输入的原程序,之所以考虑用链队列,是因为链队列是需要时才申请空间的,更重要的原因 是链队列是先进先出的,这符合我要编写的词法分析程序,而数组是在定义时就要设置好它的 容量,系统会为其分配一个固定容量的存储空间,数组一旦创建后,它的容量就不能更改,所 以它很容易造成数组越界而导致程序终止,数组容量过大就会浪费存储空间,会影响程序的运 行速度。此程序指针数组是用于存储关键字、符、算符、界符等已知其需要多大存储空间的字 符,而且程序上涉及的种别码可以通过获取数组下标得到。
主要算法:先将源程序用链队列存储起来,然后逐一从链队列中取出单个字符分析,具体 实 现,看下面的流程图
关键函数的实现:
void InitQueue() //初始化一个带节点的空队列
void Printf() //输出原程序
int search(char searchstr[],int wordtype)//符号匹配 返回种别码
void Analyze() //词法程序分析
2.流程图
2.主要程序段及其解释:
1 void Analyze() 2 { 3 char str; 4 char letter[20]; //存放字母的数组 5 char num[20]; //存放数字的字符数组 6 char other[20]; //存放其他字符的数组 7 int i; 8 do //循环获取字符分析 9 { 10 Q.front=Q.front->next; //获取单个字符 11 str=Q.front->ch; //出队列 12 if (isalpha(str)!=0) //如果是字符 13 { 14 i=-1; 15 while (isalnum(str)!=0) //判断下一个字符是否是字母 16 { 17 letter[++i]=str; //将字母存放到字符数组 18 Q.front=Q.front->next; //出队列 19 str=Q.front->ch; //获取下一个字符 20 } 21 letter[i+1]='