XX大学学生课程设计(论文)题目:关于词法分析器的实现学号:姓名:专业年级:12计科2班教师姓名:2015年6月15日摘要词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换称长度统一的标准形式——属性字(TOKEN)。而词法分析器的功能是输入源程序,输出单词符号,并且词法分析器有两种处理结构:一种是把词法分析器作为主程序;另一种是把词法分析器作为语法分析程序调用的子程序。本文所要介绍的词法分析器是第一种,把它作为主程序。关键词:词法分析编译原理AbstractLexeristhroughlexicalanalysisproceduresconstituteasourcestringisscannedfromlefttoright,toreadinsourcecodecharactersandcharacter-by-characterinaccordancewiththerulesofwordformationofindependentsignificanceintooneword.Andiftheproperty(asreservedwords,identifiers,operators,boundaries,andconstants,andsoon).Thenunifiedthemsaidthelengthofastandardform--propertywords(TOKEN).LexicalAnalyzerfunctionistheinputsource,outputWordsymbols,andlexicalanalyzerhastwostructures:oneisthelexicalanalyzerasmainprogram;theotheristheparsercallsthelexicalanalyzerprograms.Thelexicalanalyzeristhefirsttobeintroducedinthisarticle,useitasthemainprogram.Keywords:lexicalanalysisCompilerconstructionprinciples目录1课程设计的基本分析...................................................................................................................51.1词法分析器的概述...........................................................................................................51.2课程设计的内容................................................................................................................51.3课程设计的内容................................................................................................................51.4课程设计的要求................................................................................................................51.5开发工具的选用................................................................................................................62词法分析模块设计.......................................................................................................................62.1设计流程图.......................................................................................................................62.2设计思路...........................................................................................................................62.3设计代码...........................................................................................................................72.4设计结果.........................................................................................................................103总结............................................................................................................................................11参考文献:.....................................................................................................................................121课程设计的基本分析1.1词法分析器的概述词法分析器又称扫描器。其主要任务是从左到右依次描述字符中形式的源程序的各个字符,逐个识别出其中的单词,并将其转换成为内部编码形式的单词符号串输出,用于进行语法分析。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。1.2课程设计的内容通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。1.3课程设计的内容设计一个程序,调试、编译,实现词法分析的功能,识别各单词或字符所属类别,并显示在屏幕上。1.4课程设计的要求通过词法分析器能够实现以下五种类型如单词等的识别。(1)关键字begin,end,if,then,else,while,write,read等,do,call,const,char,until,procedure,repeat等(2)运算符:+,-,*,/,=等(3)界符:{,},[,],;,,,.,(,),:等(4)标识符(5)常量1.5开发工具的选用软件环境使用Win7操作系统,使用VisualC++作为编程工具,实现词法的分析。2词法分析模块设计2.1设计流程图2.2设计思路先在桌面建立两个记事本文件,取名为test1.txt和test2.txt,如下运行程序,出现提示,输入以上两个txt文件的名称,即可对记事本中的内容进行分析,并把分析结果输出显示在屏幕上。2.3设计代码#includeiostream#includestringusingnamespacestd;#defineMAX22charch='';stringkey[15]={begin,end,if,then,else,while,write,read,do,call,const,char,until,procedure,repeat};intIskey(stringc){//关键字判断inti;for(i=0;iMAX;i++){if(key[i].compare(c)==0)return1;}return0;}intIsLetter(charc){//判断是否为字母if(((c='z')&&(c='a'))||((c='Z')&&(c='A')))return1;elsereturn0;}intIsDigit(charc){//判断是否为数字if(c='0'&&c='9')return1;elsereturn0;}voidanalyse(FILE*fpin){stringarr=;while((ch=fgetc(fpin))!=EOF){arr=;if(ch==''||ch=='\t'||ch=='\n'){}elseif(IsLetter(ch)){while(IsLetter(ch)||IsDigit(ch)){if((ch='Z')&&(ch='A'))ch=ch+32;arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);if(Iskey(arr)){coutarr\t$属于关键字endl;}elsecoutarr\t$属于普通标识符endl;}elseif(IsDigit(ch)){while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){arr=arr+ch;ch=fgetc(fpin);}fseek(fpin,-1L,SEEK_CUR);coutarr\t$属于无符号实数endl;}elseswitch(ch){case'+':case'-':case'*':case'=':case'/':coutch\t$属于运算符endl;break;case'(':case')':case'[':case']':case';':case'.':case',':case'{':case'}':coutch\t$属于界符endl;break;case':':{ch=fgetc(fpin);if(ch=='=')cout:=\t$属于运算符endl;else{cout=\t$属于运算符endl;;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t$属于运算符endl;if(ch=='')cout\t$属于输入控制符endl;else{cout\t$属于运算符endl;fseek(fpin,-1L,SEEK_CUR);}}break;case'':{ch=fgetc(fpin);if(ch=='=')cout=\t$属于运算符endl;elseif(ch=='')cout\t$属于输出控制符endl;elseif(ch=='')cout\t$属于运算符endl;else{c