编译原理实验之词法分析程序

上传人:桔**** 文档编号:457792594 上传时间:2023-11-01 格式:DOCX 页数:35 大小:176.90KB
返回 下载 相关 举报
编译原理实验之词法分析程序_第1页
第1页 / 共35页
编译原理实验之词法分析程序_第2页
第2页 / 共35页
编译原理实验之词法分析程序_第3页
第3页 / 共35页
编译原理实验之词法分析程序_第4页
第4页 / 共35页
编译原理实验之词法分析程序_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《编译原理实验之词法分析程序》由会员分享,可在线阅读,更多相关《编译原理实验之词法分析程序(35页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验报告之词法分析程序姓名:卢旭学号:U200917806班级:软工0901班2011年10月22日目录一、实验题目3二、实验目的3三、实验要求4四、实验报告4总体设计思想4详细算法设计4流程框图5函数相关说明6输入与输出10程序运行结果11词法分析器使用说明12心得与体会12源程序清单12一、实验题目对下述单词表定义的语言设计编制一个词法分析器。各种单词符号对应的种别码如下表:单词符号种别编码begin1if2then3while4do5end6l(l|d)*10dd*11+13-14*15/16:17:=18202123=24=25;26(27)28#0二、实验目的设计、编制并调试

2、一个词法分析程序,如加深对词法分析原理的理解。三、实验要求处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。四、实验报告总体设计思想从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。详细算法设计1、 设置3个初值变量和一个关键字表:1) char token8 用来存放构成单词符号的字符串;2) double sum 用来存放无符号整数或者浮点数;3) int syn 用来存放单词符号的种别码;关键字表: char *rwtab6=“begin”,”if”,”then”,”while”,”do”,”e

3、nd”;2、 设置重要的全局变量:1) char ch 用来存放当前镀金的源程序字符;2) char prog80 用来存放所有用户输入的字符;3) int isDecimal 是否为浮点数,值为1表示为浮点数,否则不是浮点数4) double decimal 双精度,浮点数的小数部分5) int isE 是否为指数形式表示的浮点数,值为1:表示是指数形式表示的浮点数6) int index 指数形式的幂7) int isNeg 是否为负数幂,值为1:表示为负数幂3、 设置关键的函数:void scanner() 词法扫描程序getchar() 从控制台读取一个字符数据int strcmp(

4、char *str1,char *str2),字符串的比较double pow( double x,double y) 计算x的y次幂4、 流程:1) 记录下输入的源程序字符串2) 调用scanner()函数对字符串进行各种关键字、运算符和界符、数字的扫描匹配,并且给出相应的种别码,输出单词二元组流程框图 图C.1 词法分析主程序示意图 图C.2 词法分析程序流程函数相关说明1. getchar() 该函数用来接收用户输入:借助dowhile()循环来记录用户输入的源程序字符串doch = getchar(); /将用户输入的字符读入到ch变量中progp+ = ch; /将字符存于数组中wh

5、ile(ch != #); /当用户输入#号时,结束输入。2. scanner() 该函数用来扫描源程序字符串并进行区别分类1) 如果是字母字符,则进行关键字的匹配:if(ch=a)&(ch=A)&(ch=a)&(ch=A)&(ch=0)&(chtoken 以便进行关键字的匹配ch=progp+; /读下一个字符tokenm+=0;p-; /回退一格syn=10; /标识符/判断是否是begin,if,then,while,do,end标识符中的一个for(n=0;n=0)&(ch=0)&(ch=0)&(ch=0)&(ch=9)/指数index=index*10+ch-0;ch=progp+;

6、/10的幂/123e3代表123*10(3)if(isNegative)sum=sum*pow(0.1,index);elsesum=sum*pow(10,index);if(isSignal=1)sum=-sum;isSignal=0;p-;syn=11;3) 对界符和运算符进行判断:else switch(ch)case )syn=21; /对应21tokenm+=ch;else if(ch=)syn=22;tokenm+=ch;elsesyn=20;p-;break;case :m=0;tokenm+=ch;ch=progp+;if(ch=)syn=24;tokenm+=ch;elses

7、yn=23;p-;break;case :m=0;tokenm+=ch;ch=progp+;if(ch=)syn=18;tokenm+=ch;elsesyn=17;p-;break;case +:temp2=progp;if(temp2=0)&(temp2=0)&(temp2=9)isSignal=1;ch=progp+;goto IsNum; /转到数字的识别syn=14;tokenm+=ch;break;case *:syn=15;tokenm+=ch;break;case /:syn=16;tokenm+=ch;break;case =:syn=25;tokenm+=ch;break;c

8、ase ;:syn=26;tokenm+=ch;break;case (:syn=27;tokenm+=ch;break;case ):syn=28;tokenm+=ch;break;case#:syn=0;tokenm+=ch;break;default:syn=-1;输入与输出输入:源程序字符串,最后以#号结束;输出:单词二元组构成的序列表; 如(1, begin) (10, x) 错误:输出“input error”字符串。程序运行结果 词法分析器使用说明程序用C语言编写,可在任何windows系列的计算机上运行运行后:1. 按照输入的要求输入要解析的字符串,并且以#结束;2. 按回车键,程序即显示结果 心得与体会1. 很有难度,在机房里憋了三个小时,还是搞不定,主要是在数字那一块;2. 书上直接给出了基本的代码框架以及流程图,以此入手还是十分简单的,大致看了一下就理解了要做什么事情了;3. 最初,对于数字的识别只在于自然数方面,这个还是很简单的就实现,但是忽略了负数,因为根本没有考虑到这种情况:当识别出-时,需要进行后面数组的识别4. 知道要考虑负数以后,也很快的实现了,因为和字母是差不多得,而且,可以复用前面识别数字的代码;5. 然后就是难题啦幂的识别和计算6. 问了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号