C语言的词法分析器.doc
《C语言的词法分析器.doc》由会员分享,可在线阅读,更多相关《C语言的词法分析器.doc(23页珍藏版)》请在咨信网上搜索。
1、南华大学计算机科学与技术学院 实验报告1. 实验目的及要求1、 目的通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。2、 要求l 根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到);在实习前一定要制出相应的表。l 实验时间:4-8学时l 检查内容及时间:A)完整的实验报告。 B)在机器上调试成功的源程序。3、 软件、硬件环境l Visual studio 2010 ,Windows 7操作系统l 计算机一台2.实验步骤l 分析对于单词
2、符号我们将其分成四类:保留字、标识符、常数和界符,每类单词符号均可使用一张表格表示在词法分析过程中,保留字和界符这两个表格的内容是固定不变的(由语言确定),源程序字符串只能从其中选取,而标识符、常数这两表是在分析过程中不断形成的对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是、或中之一,那么就以单词的二元式形式输出每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串各类单词的二元式表述均具有相同的结构与长度,形式如下:(单词种别,单词自身的值)是单词种别,而单词种别共分为、四类且每类对应一张表格因此,实际上就是一
3、个指向这四类中某一类对应表格的指针则为指向该类表格中一个特定项目的指针所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入四张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便为了减少实习量,可以适量地选取,中的一个子集来进行如下表:表1保留字表内部地址 12345678910保 留 字 forwhileDOELSEIF STATICINTSIZEOFBREAKCONTINUE表2界符表内部地址 123456789101112131415161718界符 +-*/=!=(),:;表3 单词符号的编码单词符号类别编码标识符1常数2保留字3+
4、4-5*6/7810=11!=12=13=14(15)16,17:18;192021保留字表包括10个有代表性的保留字,界符表包括关系运算符,算术运算符,分隔符三种,一对圆括号,加上赋值号,花括号,分号,引号这两表的内容表明C语言的条件语句,赋值语句,WHILE型循环语句,复合语句,过程及变量说明均可作为源程序例子输入给词法分析程序,标识符表中的每一项包含一个标识符,常数表中的每一项包含一个整常数,后两表的内容都是在词法分析过程中产生的如何从源程序中识别出一个个的单词符号呢?图1中的流图清晰地反映出这一过程图1中,双圆圈的状态表示终态,即能到达终态就代表识别出一个单词符号,而带有号的终态是指处
5、理时应回退一字符l 算法词法分析器在扫描过程中,依次从源程序中取出源字符,根据图1的扫描过程状态转换图,当碰到终态时,即双圆圈的状态时就得到一个单词符号,此时可以根据第一个字符判断单词属于K,I,C,P中哪一个类,从而确定单词的“单词种别”和“单词自身的值”。2字母非字母与数字1字母与数字0空白4数字非数字3数字+6;58:非=7=9(10,11)12其它171416=图1扫描程序的状态转换图 说明:这个图只是大概表达一个词法分析的思路,由于不知道加入,所以并不完全准确。2. 实验内容 流程图 、程序其它界符数字字母出错处理有C表有此单词否?形成一项无形成(C,i)十进制数转化成二进制数K表有
6、此单词否?形成(I,i)形成(K,i)有无查界符表形成(P,i)源程序完否?输出二元式开始开始对源程序扫描扫描到的单词符号首字母是什么?完未完图2词法分析算法流图源程序#include #include #include #include #include #define LENGTH1 10 /定义保留字的大小FILE * fp=NULL; /输出流指针FILE * fw=NULL; /输入流指针char character; /字符char token16; /字符数组,用来存放已读入的字符序列/编码表char* CODE=identifier/*标识符*/,constant/*常数*/,
7、keyword/*保留字*/,+,-,*,/,=,!=,=,=,(,),:,;,;/保留字表char *k=for,while,do,else,if,static,int,sizeof,break,continue;/标识符结构体typedef structchar * I256; /标识符数组int len;/标识符数量 identifier; /常量结构体typedef struct int cont300;/存放常量的数组int len;/常量的数目 constnumber;/读入一个字符,从输入流中读入一个字符到变量character中。void getNextChar(FILE *i
8、fp)if(character=getc(ifp)=EOF)exit(1);/读入非空白字符,检查变量character中的字符是否为空白字符或回车或换行符。若是,/则调用getNextChar()读入下一个字符,直到character中的字符满足条件.void getnbc(FILE *ifp)while(character= | character=n|character=9)getNextChar(ifp);/连接字符串,把character中的字符连接到token数组的结尾。void concat()char * ct=&character;strcat(token,ct);/判断是否
9、为字母。int letter()return isalpha(character);/判断是否为数字int digit()return isdigit(character);/回退字符,将刚读入的character中的字符回退到输入流中。并把character中的值置为空。void retract(FILE *ifp)(ifp-_cnt)+;(ifp-_ptr)-;character= ;/处理保留字,对存放在token中的字符串查保留字,若查到,则返回该保留字的类别编码,否则返回0.int reserve(char *k)int i;for(i=0;iLENGTH1;i+)if(strcmp
10、(token,ki)=0)return i+1;return 0;/处理标识符,对存放在token中的字符串查找符号表,若查到,则返回它在符号表的位置,/存入常数表中,并返回它在常数表中的位置编号。int symbol(identifier * id)int i;for(i=0;ilen;i+)if(strcmp(token,id-Ii)=0)return i+1;if(id-len256)assert(0);id-Iid-len=token;id-len+;return id-len;/将数字字符串转化为整数。int strtonumber()int i;int sum=0;for(i=0;
11、icontcon-len=strtonumber();con-len+;return con-len;/将整数值转化为字符串char * numbertoString(int num)char s3;int i=num/10;while(i0)char c=i+0;strcat(s,&c);return s;/将结果写入到文件并且输出到屏幕。void returntofile(int num,int val,identifier *id,constnumber *con)int i;int _num=num;char c;c=(;putc(c,fw);printf(%c,c);i=_num/1
12、0;while(i0) _num=_num-10*i;c=(i+0);printf(%c,c);putc(c,fw);i=_num/10;c=_num+0;printf(%c,c);putc(c,fw);printf(,);putc(,fw);/如果是标识符或常数 则放入括号内。if(num=1) /处理标识符printf(%s,id-Ival-1);printf();printf(n);fputs(id-Ival-1,fw);putc(),fw);putc(n,fw);if(num=2) /处理常数_num=con-contval-1;i=_num/10;while(i0)_num=_num
13、-10*i;c=(i+0);printf(%c,c);putc(c,fw);i=_num/10;c=_num+0;printf(%c,c);printf();printf(n);putc(c,fw);putc(),fw);putc(n,fw);if(num=3) /保留字printf(-);printf();printf( );printf(#);printf(%s,kval-1);printf(#);printf(n);putc(-,fw);putc(),fw);fputs( ,fw);putc(#,fw);fputs(kval-1,fw);putc(#,fw);putc(n,fw);if(
14、num3) /处理界符printf(-);printf();printf( );printf(#);printf(%s,CODEnum-1);printf(#);printf(n);putc(-,fw);putc(),fw);fputs( ,fw); putc(#,fw);fputs(CODEnum-1,fw);putc(#,fw);putc(n,fw);/将错误写入到文件或输出到屏幕void error()printf(ERROR,);printf(%c,character);printf();printf(n);fputs(ERROR,fw);putc(character,fw);putc
15、(),fw);putc(n,fw);/词法分析函数void LexAnalyze(char *k,char *CODE,identifier *id,constnumber *con,FILE *fp,FILE *fw)int num,val;strcpy(token,);getNextChar(fp);getnbc(fp);switch(character)case a:case b:case c:case d:case e:case f:case g:case h:case i:case j:case k:case l:case m:case n:case o:case p:case q:
16、case r:case s:case t:case u:case v:case w:case x:case y:case z:case A:case B:case C:case D:case E:case F:case G:case H:case I:case J:case K:case L:case M:case N:case O:case P:case Q:case R:case S:case T:case U:case V:case W:case X:case Y:case Z:while(letter()|digit()concat();getNextChar(fp);retract(
17、fp);num=reserve(k);/保留字if(num!=0) returntofile(3,num,id,con);else val=symbol(id);returntofile(1,val,id,con);break;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:while(digit()concat();getNextChar(fp);retract(fp);val=constant(con);returntofile(2,val,id,con);break;case :getNextCh
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 词法 分析器
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。