S语言词法分析器设计.doc_第1页
S语言词法分析器设计.doc_第2页
S语言词法分析器设计.doc_第3页
S语言词法分析器设计.doc_第4页
S语言词法分析器设计.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验1-4 S语言词法分析器设计实验1-3 S语言词法分析器设计一、实验名称:S语言词法分析器设计二、实验目的:通过手工编写简化C语言词法分析器,熟悉并深入理解编译程序词法分析器的工作原理。三、实验内容:1根据保留字和特殊符号表能区分出源文件中的保留字、普通标识符和特殊符号,并能进行简单的错误处理。2设计词法分析器模块调用结构图和各模块流程图。3程序源代码。4程序的执行结果:输入文件,输出结果文件及屏幕信息。四、实验中出现的问题及解决方法。遇到问题及解决:1、关于注释/和除号/。需要区分,在isanotation函数中。2、关于遇到空格时回退,一开始没有懂,后来经过同学讲解,明白了如何回退的。3、关于词法分析器的思想过程,经过老师再三讲解,已经大致明白,具体步骤,在最后体会部分中。五、程序结构和代码程序结构:代码:7#include#include#include#includeusing namespace std;/关键字表string keywords20=include,void,main,int,char,float,double,if,else,then,break,continue,for,do,while,printf,scanf,begin,end,return;char aa99999= ;/关键字表初始为空string id10000;int pp=0;/常数表string nu10000;int qq=0;/初始化函数void initscanner()int i=0;FILE *fp;if(fp=fopen(源程序.txt,r)=NULL)/打开源程序文件printf(没有找到此文件!);exit(0);char ch=fgetc(fp);while(ch!=EOF)aai=ch;i+;ch=fgetc(fp);fclose(fp);int decide1(char a) /判断是否是字母if(a=a&a=A&a=0&a=9)return 1;else return 0;int isalpha(int st) /识别保留字和标识符char wordbuf20= ;int n=0;for( ; ; )wordbufn=aast;st+;n+;if(decide2(aast)=1)|(decide1(aast)=1)|(aast=_)wordbufn=aast;else break;int flag=0;for(int k=0;k20;k+)if(strcmp(keywordsk.c_str(),wordbuf)=0) flag=1;if(flag=0)int flagg=-1;for(int t=0;tpp;t+)if(strcmp(idt.c_str(),wordbuf)=0)flagg=t;if(flagg!=-1) printf( (id,%d) ,flagg);elseidpp=wordbuf;printf( (id,%d) ,pp);pp+;elseprintf( ();for(int i=0;in;i+)printf(%c,wordbufi);printf(,-) );return st;int isnumber(int st) /识别数字char numbuf20= ;int n=0;int k=0;int flag=0;for( ; ; )numbufn=aast;st+;n+;if(decide2(aast)=1)numbufn=aast;else if(k=0)&(aast=.)numbufn=aast;k+;else if(decide1(aast)=1)numbufn=aast;flag=1;continue;else break;if(flag=0)int flagg=-1;for(int t=0;tqq;t+)if(strcmp(nut.c_str(),numbuf)=0)flagg=t;if(flagg!=-1) printf( (nu,%d) ,flagg);elsenuqq=numbuf;printf( (nu,%d) ,qq);qq+;elseprintf( ();for(int i=0;in;i+) printf(%c,numbufi);printf(,错误) );return st;int isanotation(int st) /处理除号/和注释char tabuf9999= ;int n=0;st+;if(aast=/)printf( (/,-) );st+;while(aast!=10)tabufn=aast;st+;n+;printf( ();for(int i=0;in;i+)printf(%c,tabufi);printf(,注释内容) );else if(aast=*)printf( (/*,-) );st+;int stt=st+1;while(1)if(aast=*&aast+1=/) break;tabufn=aast;st+;n+;if(aast+1=NULL)printf(/* 错误n);return st+1;printf( ();for(int i=0;i: st+;if(aast=)st+;printf( (rlop,=) );else printf( (rlop,) );break;case : st+;if(aast=)st+;printf( (rlop,=) );else printf( (rlop,) );break;case %: st+;if(aast=)st+;printf( (%=,-) );else printf( (%,-) );break;case !: st+;if(aast=)st+;printf( (!=,-) );else printf( (!,错误!) );break;case &: st+;if(aast=&)st+;printf( (&,-) );else printf( (&,错误) );break;case |: st+;if(aast=|)st+;printf( (|,-) );else printf( (|,错误) );break;case : st+;printf( (,-) );break;case : st+;printf( (,-) );break;case (: st+;printf( (,-) );break;case ): st+;printf( (),-) );break;case : st+;printf( (,-) );break;case : st+;printf( (,-) );break;case : st+;printf( (:,-) );break;case #: st+;printf( (#,-) );break;case ;: st+;printf( (;,-) );break;case .: st+;printf( (.,-) );break;case ,: st+;printf( (,-) );break;case : st+;break;case : st+;break;case 10: st+;printf(n);break;case 34: st+;printf( (,-) );break;case 39: st+;printf( (,-) );break;default: printf( (%c,错误) ,aast);st+;return st;int lexscan(int st) /根据读入的单词的第一个字符确定调用不同的单词识别函数if(decide1(aast)=1)/如果是字母st=isalpha(st);else if(decide2(aast)=1)/如果是数字st=isnumber(st);else if(aast=/)/如果是标识符或关键字st=isanotation(st);else st=isother(st);/其他特殊字符return st;void scanner() /若文件未结束,反复调用lexscan函数识别单词int i=0;while(aai!=NULL)i=lexscan(i);void print()coutendl;coutendl关键字、标示符表如下:endl;cout=endl;for(int i=0;ipp;i+)co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论