资源描述:
《题目意义及计思想.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一.题目意义及设计思想1.题目意义在理论和基础实验基础上,通过开发规模较大的程序,掌握应用计算机解决实际问题的基本方法;熟悉C程序开发的全过程,包括从分析问题开始,建立数据模型,划分功能模块,设计算法,编码,调试和测试程序,撰写文档等;提高综合应用C语言的能力,强化编程和调试能力。同时,词法分析器作为以后编译原理重点学的知识,能为以后学习打下一点基础。2.设计思想词法分析器是编译的第一阶段,其主要任务是读入输入字符,产生记号序列,供语法分析器使用,所以应该能识别常数、标示符及关键字。作为编译器中读入源程序的部分,词法分析器当然也需要能完
2、成一些相关点的辅助任务:一,是过滤掉源程序中的注释、空格、制表符、换行符;二,使编译器能将发现的错误信息与源程序的出错位置联系起来。3.采用的主要技术、遇到的难点和解决方法1,程序中使用标示符作为变量名、数组名、函数名和一些其他的语言对象名。由于关键字符合标示符的规则。程序要识别标示符和关键字,就必须对属于标示符的字符串,和关键字进行比较。若字符串不是关键字,则是标示符。在这里,我将程序语言的所有关键字保存于一个文件中,在需要判断的时候,拿字符串和文件里的关键字一一比较。2.注释的判断。程序语言的注释有助于理解程序,但是在编译时并不被编
3、译器读取,因此在词法分析阶段要剔除。C语言的注释以“/*”开始,以“*/”结束,因此当读到“/*”是就认为是注释的开始,接着就一直读下去直到遇到“*/”,然后输出注释部分,并告知读者。由于‘/’和‘*’是两个字符,这里需要判断是否读到了“*/”。我设了一计数变量count,当读到‘*’时count+1,若读入的下一个字符是‘/’时就认为是结束,此时计数变量再count+1。若不是‘/’,继续往下读,但是count不加1。整个判断注释结束部分“*/”以while(count!=2)循环。3.读取的是以数字为开头的判断,相对来说比较麻烦。…
4、..4三、实现的主要功能和系统结构1.实现的功能程序的输入部分由使用者自行输入需要分析的代码。该程序可以识别出关键字、标示符、数字、符号,输出其类型代号。对于符号还将输出其区别于其它符号的所赋予的值。成功的判断了字符串和注释部分。对于注释部分一次性输出,并注明。输出结果以保存于使用者输入的文件里。2.系统结构该程序分为三部分:包含头文件的global.h;包含程序初始化的函数及一些基本函数的init.h;包含主要处理函数及main()的lexer.c具体结构图如下mainHelpparseinitFind主要函数功能设置:voidini
5、t()//实现程序的初始化函数,包括构造存放关键字和符号//的文件,初始化输出文件和帮助文件。intFind(char*arr)//在关键字文件里查询字符串存于数组arr中的//是否为关键字,是,返回0,否则,返回1。voidHelp()//在帮助文档中输出一些关于程序结果的解释,voidparse()//主要判断函数,通过if/else语句判断读入的字符是何种类型,并将其输出到用户指定的文件里程序流程图:四、核心算法描述和相关技术说明该程序的核心部分在parse()函数里,而该函数的关键在于字符串,数字,标示符,关键字和注释的判断上。
6、现分别描述个部分的算法。1.判断关键字,标示符的算法if(isalpha(ch)
7、
8、ch=='_')/*开头是字母或下划线*/{while(isalpha(ch)
9、
10、isdigit(ch)
11、
12、ch=='_'){arr[i++]=ch;ch=fgetc(fpin);}arr[i]=' ';if(Find(arr))/*find函数,若arr存储的是关键字返回0,否则返回1*/{fprintf(output,"%-10st%5dt%-5s",arr,type[1],"id");/*标示符*/}else{fprintf(output
13、,"%-10st%5dt%-5s",arr,type[0],"kword");/*是关键字*/}continue;}2.判断是数字的算法if(isdigit(ch))/*分析数字的情况*/{while(isdigit(ch)){arr[i++]=ch;ch=fgetc(fpin);}if(ch=='.')/*出现点时*/{arr[i++]=ch;/*将点加入*/ch=fgetc(fpin);/*继续读取*/if(isdigit(ch)){while(isdigit(ch))/*读取的是数字时,加入*/{arr[i++]=ch;c
14、h=fgetc(fpin);}if(isalpha(ch))/*如果是数字加点以后加非数字的情况时就是错误*/{while(isdigit(ch)
15、
16、isalpha(ch)
17、
18、ch=='_'){arr[i+