实验安排+词法分析程序设计与实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验一词法分析程序设计与实现一、实验目的:加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、实验内容:自定义一种程序设计语言,或者选择已有的一种高级语言(C语言),编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程工具。三、实验要求:1.对单词的构词规则有明确的定义;2.编写的分析程序能够正确识别源程序中的单词符号;3.识别出的单词以种别码,值的形式保存在符号表中;4.词法分析中源程序的输入以.c格式,分析后的符号表保存在.txt文件中。5.*对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6.实验报告要求用自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现*。四、实验学时:6学时五、实验步骤:1.定义目标语言的可用符号表和构词规则;2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3.对正确的单词,按照它的种别以种别码,值的形式保存在符号表中;4.*对不正确的单词,做出错误处理*。六、选作实验学生可以根据自身的情况完善词法分析程序的错误处理功能(实验要求5&6),如对错误的单词给出准确的位置和错误类型提示。七、作业提交时间第8周实验课结束后提交词法分析程序(zzwyanqiu@163.com)。八、提示1.charScanin[100],Scanout[100];//用于接收输入输出文件名FILE*fin,*fout;//用于指向输入输出文件的指针2.//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。//如果想增加保留字,可继续添加,并修改保留字数目#definekeywordSum8char*keyword[keywordSum]={if,else,for,while,do,int,read,write};3.//下面定义纯单分界符,如需要可添加charsingleword[50]=+-*(){};,:;4.//下面定义双分界符的首字符chardoubleword[10]==!;5.scanf(%s,Scanin);printf(请输入词法分析输出文件名(包括路径):);scanf(%s,Scanout);6.if((fin=fopen(Scanin,r))==NULL)//判断输入文件名是否正确{printf(\n打开词法分析输入文件出错!\n);return(1);//输入文件出错返回错误代码1}if((fout=fopen(Scanout,w))==NULL)//判断输出文件名是否正确{printf(\n创建词法分析输出文件出错!\n);return(2);//输出文件出错返回错误代码2}7.ch=getc(fin);//读取文件里的一个字符8.isalpha(ch)//字母判断函数isalnum(ch))//数字判断函数strcmp(token,keyword[n])//串比较fprintf(fout,%s\t%s\n,ID,token);//输出标识符符号到fout指定的文件strchr(singleword,ch)//声明:char*strchr(constchar*string,intc);//在字符串string中搜索字符c,若成功则返回一个指向该字符第一次出现的位置,否则返回NULL//这个例子中的变量x的值为5:charstring[]=hello;char*p;intx;p=strchr(string,'o');x=p-string+1;库函数查找地址任务1:识别小型语言所有单词的词法分析程序设计源程序设计语言G[程序]程序→变量说明BEGIN语句表END.变量说明→VAR变量表:类型;|空变量表→变量表,变量|变量类型→INTEGER语句表→语句|语句;语句表语句→赋值语句|条件语句|WHILE语句|复合语句赋值语句→变量:=算术表达式条件语句→IF关系表达式THEN语句ELSE语句WHILE语句→WHILE关系表达式DO语句复合语句→BEGIN语句表END算术表达式→项|算术表达式+项|算术表达式-项项→因式|项*因式|项/因式因式→变量|整数|(算术表达式)关系表达式→算术表达式关系符算术表达式变量→标识符标识符→标识符字母|标识符数字|字母整数→0|非零数字泛整数泛整数→数字|数字泛整数|ε关系符→|=|==||=|字母→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z非零数字→1|2|3|4|5|6|7|8|9数字→非零数字|0空→要求和提示:词法分析阶段,可以打开任意位置和名称的源文件进行词法分析,可以进行非法字符和数字后边跟字母的错误判断,如果没有错误则提示“词法分析正确完成!”,并且可以选择输出token.txt(token文件)string.txt(符号表)两个文件;1.词法分析程序的主要任务如下:①组织源程序的输入,识别出源程序中的各个基本语法单位(也称为单词或语法符号),按规则转换成二元式的形式;②删除无用的空白字符、回车符、及其它非实质性符号;③删除注解行;④为后面的语法和语义分析提供二元式链表;单词编码单词编码标识符115正整数2=16BEGIN317END4=18IF519THEN6==20ELSE7;21WHILE8.22DO9:=23INTEGER10,24+11(25-12)26*13/141)对标识符的长度控制在8个字符(包括8个)以内,超过的做截断处理;2)数字不大于65535,否则报错;3)能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,换行都是白空格,除了用来分隔单词以外,没有意义;4)能跳过注释:a)接连出现的/*到下一次接连出现的*/之间的任何文字都是注释(多行);b)从某行接连出现的//到该行的结尾的任何文字都是注释(单行)。3.怎样编写词法分析程序:1)预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除注释,删除多余的白空格;2)从源程序字符数组中获得单词,编码为二元式.:二元式采用结构体数组存储,把单词类型和词元记录下来。分解单词的方法:1)Case多路转换语句根据单词的特点直接编写;2)通过描述单词的正规文法得到相应的有穷自动机,通过case多路转换语句完成有穷自动机的处理流程。3.编写词法分析程序要注意的问题:1)检查词法是否有错误检查是否有非法字符:如@,&,!检查标志符和数字是否满足限制条件检查注释符号是否配对2)符分隔单词能够区分两个单词的符号为界符有些界符不是单词:如白空格有些界符仅仅用来分隔:如;有些界符本身还是源程序不可缺少的单词,如(,),+,/,等等有些界符包含两个字符:如,=等等3)输出词法错误如果有错误,需要报告词法错误的原因。并且要能够越过错误,分解下一个单词,直到源程序结束。4)输出的二元式流保存在二元式结构体数组中。#includeiostream#includefstream#includesstream#includestring#includevector#includealgorithmusingnamespacestd;boolisLetter(charch){if((ch='A'&&ch='Z')||(ch='a'&&ch='z'))returntrue;elsereturnfalse;}boolisDigit(charch){if(ch='0'&&ch='9')returntrue;elsereturnfalse;}boolisP(charch){if(ch=='+'||ch=='*'||ch=='-'||ch=='/')returntrue;//ch==':'||ch==','||ch=='='||ch==';'||ch=='('||ch==')'elsereturnfalse;}boolisJ(charch){if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='='||ch==':'||ch==''||ch==''||ch=='{'||ch=='}'||ch=='#')returntrue;//elsereturnfalse;}boolisBlank(charch){if(ch==''||ch=='\t')returntrue;elsereturnfalse;}intmain(){stringsrc,ste,s;charch0,ch,ch1[2];charktt[48][20]={and,begin,const,div,do,else,end,function,if,integer,not,or,procedure,program,read,real,then,type,var,while,write,标识符,无符号数,,,;,:,.,(,),[,],..,++,--,+,-,*,/,=,,,,=,=,:=,{,},#};intpos=0;FILE*fp;fp=fopen(d:\\in.txt,r);ch0=fgetc(fp);while(ch0!=EOF){//if(ch0!='\t'){src+=ch0;}src+=ch0;ch0=fgetc(fp);}src+='#';coutsrcendl;ch=src[pos++];ste=;for(intj=0;j47;j++){coutjktt[j]endl;}cout词法分析:\n;while(ch!='#'){charstr[20];if(ch!='\n'){if(isDigit(ch)){//判断常数inti=0;while(isDigit(ch)||ch=='.'){str[i++]=ch;//i++;ch=src[pos++];}str[i]='\0';ste=ste+|+22;coutstr;continue;}elseif(isLetter(ch)){//判断字符inti=0,j;while(isLetter(ch)||isDigit(ch)){str[i++]=ch;//i++;ch=src[pos++];}str[i]='\0';for(j=0;j21;j++){//判断是否关键字intt=strcmp(str,ktt[j]);if(t==0){stringstreamss;ste+=|;ssste;ssj;ssste;break;}}if(j==21){ste=ste+|+21;}//cout;coutstr;continue;}elseif(isP(ch)){///判断是否运算符inti=0,j;str[i++]=ch;str[i]='\0';for(j=34;j38;j++){intt=strcmp(str,ktt[j]);if(t==0){stringstreamss;ste+=|;ssste;ssj;ssste;break;}}coutstr;ch=src[pos++];continue;}elseif(isJ(ch))//判断是否界符{inti=0,j;while(isJ(ch)){str[i++]=ch;c

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功