首页 > 代码库 > 词法分析~实验报告
词法分析~实验报告
实验一、词法分析实验
专业 商业软件3班 姓名 陈笑璞 学号 201506110218
一、 实验目的
(1) 编制一个词法分析程序
(2) 词法分析是编译的第一个阶段,主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。
(3) 通过词法分析的练习,能够进一步了解编译原理。
(4) 通过了解词法分析程序的设计原则、单词的描述技术、识别机制及词法分析程序的自动构造原理。
二、 实验内容和要求
(1) 输入:源程序字符串
(2) 输出:二元组(种别,单词符号本身)。
三、 实验方法、步骤及结果测试
实验方法、步骤:
(1) 对字符串表示的源程序
(2) 从左到右进行扫描和分解
(3) 根据词法规则
(4) 识别出一个一个具有独立意义的单词符号
(5) 以供语法分析之用
(6) 发现词法错误,则返回出错信息
2、原理分析: 我的设计思路是利用链队列(好处:先进先出且不浪费存储空间)进行存储用户输入字符串,
以回车键结束(其中必须以非数字结尾,否则程序出错)(这是我在后来的编程里遇到的问题,我知道问题出在哪里,
但我现在还解决不了,因为我是通过申请子针域来存储,所以我是利用p->next来作为判断结束条件,
如果以数字结束,那p->next指向未知领域,程序出错,同时这也是很危险的),然后我是利用出队列来判断,
如果是字母存进数组里,直到下一个字符不是字母,调用函数判断数组的字符串,利用strcmp来判断,输出数组,再清空数组;
void Print(char str[])//调用函数来判断关键字与标识符并输出{ int i=0; if(strcmp(str,"begin")==0) printf("(1,‘%s‘)\n",str); else if(strcmp(str,"if")==0) printf("(2,‘%s‘)\n",str); else if(strcmp(str,"then")==0) printf("(3,‘%s‘)\n",str); else if(strcmp(str,"while")==0) printf("(4,‘%s‘)\n",str); else if(strcmp(str,"do")==0) printf("(5,‘%s‘)\n",str); else if(strcmp(str,"end")==0) printf("(6,‘%s‘)\n",str); else { if(str[0]==‘\0‘) return; printf("(10,‘%s‘)\n",str); } memset(str,0,N);//清空数组str里的所有元素}
结果测试:
四、 实验总结
说实话,通过这次的编译原理词法分析的实验,我遇到了不少问题,也学到了不少的东西,因为这次实验
我是想用我自己的想法来编写程序,我是用链队列来存储字符串的,也许用数组来存储字符串会简单点,
但我不想,我还是想利用链队列来存储字符串,这样可以节约存储空间,还可以利用队列先进先出的特点,
不好就是利用队列不够灵活,每次都要出栈判断、存储,释放p的子针域;虽然在编写过程中,遇到不少问题,
遇到一个,就想办法解决一个,通过问朋友老师等,也通过发朋友圈问,还通过发博客来问大神们,这种途径是
最有效的,也是最好的;所以每次就差一点就做好了,又会遇到一个新的问题,就要想办法去解决它,如今
除了字符串是以数字结尾会出现问题外(暂时没找到好的方法),其他问题已解决。
词法分析~实验报告