




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译技术实验报告实验题目:词法分析学 院:信息学院专 业:计算机科学与技术学 号:姓 名:、实验目的(1) 理解词法分析的功能;(2) 理解词法分析的实现方法;】、实验内容PLO的文法如下 为非终结符。:=该符号的左部由右部定义,可读作定义为”表示或,为左部可由多个右部定义。表示花括号内的语法成分可以重复。在不加上下界时可重复o到任意次数,有上下界时可重复次数的限制。门表示方括号内的成分为任选项。()表示圆括号内的成分优先。上述符号为元符号”文法用上述符号作为文法符号时需要用引号括起。程序工=分程序.分程序工=变量说明部分过程说明部分语句变量说明部分工=VAR标识符,标识符 : INTEGER
2、无符号整数工=数字数字标识符工=字母字母|数字过程说明部分工=过程首部分程序;过程说明部分;过程首部工=PROCEDUR标识符;语句工=赋值语句|条件语句|过程调用语句|读语句|写 语句|复合语句|空赋值语句工=标识符:=表达式复合语句工=BEGIN语句;语句END条件二=表达式关系运算符表达式表达式工=项加法运算符项项工=因子乘法运算符因子因子工=标识符|无符号整数|(表达式)加法运算符二=+|-乘法运算符工=*关系运算符二=|=|=条件语句工=IF条件THEN语句字母工=a|b| |X|Y|Z数字工=0|1|2| |8|9实现PL0的词法分析三、实验分析与设计PLO词法分析程序是一个独立的
3、过程,其功能是为语法语义分析提供单词, 把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。其主要方法步骤为从源程序扫描下一个字符,忽略空格、换行、TAB和注释并识别单词,再将不同类别的单词归类输出。四、实验的实现#i nclude #i nclude#i nclude#in clude/norw-1个关键字/最长的关键字的长度#in clude#defi nenorw 11#defi neal 20#defi ne ID norw#defi ne INT norw+1#defi ne COMMA norw+2 #defi ne ENDF norw+3 #defi ne COLO
4、N norw+4 #defi ne SEMIC norw+5 #defi ne ADD norw+6 #defi ne MINUS norw+7 #defi ne MULTI norw+8 #defi ne EVALU norw+9 #defi ne LE norw+10 #defi ne NE norw+11 #defi ne LT norw+12 #defi ne EQ norw+13 #defi ne GE norw+14 #defi ne GT norw+15 #defi ne FLOAT norw+16char TOKEN20;/各个字符extern in t lookup(char
5、 *);/exter n void report_error(char); / bool isalpha(char);/bool isa Inu m(char);/bool isdigit(char);/字符数组用来依次存放单词词文的以TOKE字符串查保留字表报告程序中的词法错误判断接收字符是否为字母判断接收字符是否为字母或者数字 判断接收字符是否为数字bool isa nno tatio n( char); /判断接收字符是否为注释extern char letter(char c); /用来将大写字母转化成小写字母FILE* fin;FILE* fout;void sea nner()/词
6、法分析的主体程序,对输入的文本文件进行词法分析char ch;int i,c;int error=0;/记录文件中词法错误的个数ch=fgetc(fi n);/从输入文件中读取一个字符while(ch!=EOF)/当从输入文件接收的字符不是文件结束符时,执行循环if(isalpha(ch)/如果从输入文件接收的第一个字符是字母ch=letter(ch);TOKENO=ch;ch=fgetc(fi n);i=1;while(isa Inu m(ch) ch=letter(ch);TOKENi=ch;i+;ch=fgetc(fi n);TOKENi=0;c=lookup(TOKEN);/查保留字表
7、if(c=0) fprin tf(fout,(%d,%s)n, ID,TOKEN); /输出标识符else fpri ntf(fout,(%d,%s)n, c,TOKEN);/输出接收单词为保留字if(isdigit(ch)/如果从输入文件接收的第一个字符是数字in t cdot=0;/统计小数点个数TOKEN0=ch;ch=fgetc(fi n);i=1;while(isdigit(ch)|ch=.)/从第二个接收字符开始,当是数字或者是小数点时,执行循环if(ch=.)cdot+;TOKENi=ch;i+;ch=fgetc(fi n);重复接收字符,直到接收到非数字if(cdot=2)er
8、ror+;TOKENi=0;prin tf(%s is errorn, TOKEN);break;if(isalpha(ch) /如果第二个字符是字母while(isalpha(ch) /接收完所有的字母,跳出循环TOKENi=ch;i+;ch=fgetc(fi n);TOKENi=0;erro 叶+;prin tf(%s is errorn, TOKEN);else if(cdot=0) /当接收的字符为整型单词时fseek(fi n,-1,1);TOKENi=0;int a,temp=0,c;for(c=0;ci;c+)a=TOKENc - 0;if(c!=0)temp=temp*10;t
9、emp=temp+a;elsetemp=a;fprin tf(fout,(%d,%d)n, INT, temp);/输出接收单词为整数else if(cdot=1)fseek(fi n,-1,1);TOKENi=0;int a,part1=0,jc,b=0;/b用来确定小数点所在的位置float c=0.1,part2=0.0;while(TOKENb!=.)b=b+1;for(jc=0;jcb;jc+)a=TOKENjc - 0;if(jc!=0)part1=part1*10;part1=part1+a;elsepart仁a;for(jc=b+1;jci;jc+)a=TOKENjc-0;pa
10、rt2=a*c+part2;c=c*0.1;fprintf(fout,(%d,%f)n, FLOAT, part1+part2);/输出接收单词为小数else if(cdot=2)fseek(fi n,-1,1);else /如果从输入文件接收的第一个字符既不是字母又不是数字switch(ch)/将所接收到的符号字符进行分类,采取一符一类case:ch=fgetc(fi n);if(ch=) fprin tf(fout,(%d,:=)n, EVALU);/输出接收符号为赋值号elsech=fgetc(fi n);fseek(fi n,-1,1);/文件接收字符回推一个字符fprintf(fou
11、t,(%d,:)n, COLON);/输出冒号break;case,:fpri ntf(fout,(%d,)n, COMMA); break;/输出逗号case.:fpri ntf(fout,(%d,.)n, ENDF);break;/输出句号case;:fpri ntf(fout,(%d,.)n, SEMIC);break;/输出分号case+:fpri ntf(fout,(%d,+)n, ADD);break;/输出加号case-:fpri ntf(fout,(%d,-)n, MINUS);break;/输出减号case*:fpri ntf(fout,(%d,*)n, MULTI);bre
12、ak;/输出乘号casev:ch=fgetc(fi n); if(ch=)fpri ntf(fout,(%d,)fpri ntf(fout,(%d,)n, NE);/输出不等于号elsefseek(fi n,-1,1);fprin tf(fout,(%d,:ch=fgetc(fi n); if(ch=)fpri ntf(fout,(%d,=)n, GE);/输出大于或等于号elsefseek(fi n,-1,1);fprin tf(fout,(%d,)n, GT);/输出大于号break;case :break;casen:break;caset:break;case/:ch=fgetc(fi
13、 n);检查是否为单行注释if(ch=/) while(ch!=n)ch=fgetc(fi n);else fseek(fi n,-1,1);prin tf(/ is errorn);erro 叶+;break;case:while(1)ch=fgetc(fi n);if(ch=) break;if(ch=EOF) fseek(fi n,-1,1);prin tf( is error n);erro 叶+; break;break;接收非继续default:pri ntf(%c is error n, ch);/上述字符程序报告词法错误error+;break;ch=fgetc(fi n);/
14、从文件中读取下一个单词,直到文件结束/while循环结束printf( 共发现%d个词法错误!,error); return;int lookup(char *toke n)int j;char word norwal;strcpy(&(word10), begi n);strcpy(&(word20), e nd);strcpy(&(word30), var); strcpy(&(word40), in teger); strcpy(&(word 5 0), while);strcpy(&(word 6 0), do);strcpy(&(word70), if);strcpy(&(word8
15、0), the n); strcpy(&(word90), procedure); strcpy(&(word100), else);for(j=1;j=a&c=A&c=a&c=A&c=0&c=0&c=A&c=Z) c=c+32;return c;int main()char file name20;printf(请输入文件名:);sea nf(%s,file name);if(fi n=fope n(file name,r)=NULL) /打开要读取的文本文件printf(不能打开文件.n);exit(0);printf(请输入保存分析结果的文件名:);sca nf(%s,file name
16、);if(fout=fope n(file name,w)=NULL)printf(不能打开文件.n);exit(0);scann er();/ 调用词法分析程序getchar();getchar();fclose(fi n);fclose(fout);return 0;五、运行的结果21B词法分析tarter FiI曲嚴伽亡请输入文件名洁松入保存分卅结果的文件名3ahc is error& is error/ is erroi* is erroi$ is error)is errorS-Sv is error y is error cxecut ion t ine : 8 *00? s Press any key to continue_U si -记事本文件(F)端辑(E裕式(0)童看(V竺)(1L y) (13/)(IL z) (15/)(113 nteger) (16/)(IL a) (15/)(IL nte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论