网站大量收购独家精品文档,联系QQ:2885784924

北邮 编译原理 词法分析器实验.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北邮 编译原理 词法分析器实验

词法分析程序设计 一.问题描述 1.可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。 2.可以并识别读取源程序中的注释。 3.可以统计源程序中的语句行数、单词个数和字符数,其中标点和空格不计为单词,并输出统计结果。 4.检察源程序中存在的错误,并可以报告错误所在行列的位置。 5.发现原程序中存在的错误,进行适当修复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。 二.算法思想 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词形成记号流文件输出。其中,具体子问题有: (1)源程序文件读入缓冲区中(注意要删除空格和无用符号) (2)确定读入的为关键字还是运算符还是变量名,对于普通标识符和常量,分别建立标识符表和常量表当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则进入符号表或常量表中并返回表的入口地址。 (3)对于各类运算符、标点符号、以及注释符号等,准确识别出来并打印输出结果 (4)对于源文件中出现的数字常量,不但能按要求加入常量表中,还进行了字符型到float型数值的转换,便于后续程序操作处理。 (4)尽量精简整合各种情况,使算法复杂度降低,精简易读。 三、实验程序设计说明 1.主要函数说明 void readChar();//读字符过程,每调用一次,从输入缓冲区读一个字符,并把它放入变量C中,且向前扫描指针pointer指向下一个字符 void ignoreSpace();//每次调用时,检查C中的字符是否为空字符,若是,则反复调用该过程,直到C进入一个非空字符为止 void link();//把C中的字符与token中的字符串连接起来 bool alphabet();//布尔函数,判断C中的字符是否为字母,若是则返回true,否则返回false bool digit();//布尔函数,判断C中的字符是否为数字,若是则返回true,否则返回false int searchForKeywords();//查关键字表,若此函数的返回值为0,则表示token中的字符串是标识符,否则为关键字 int searchForToken();//查符号表,若此函数的返回值为0,则表示token中的字符串是新出现的,否则为已出现过的标识符 int searchForNum(); //查常数表,若此函数的返回值为0,则表示token中的数字是新出现的,否则为已出现的常数 void insertTokenList();//将标识符插入符号表 void insertNumList();//将数字插入常数表 void fillBuffer(int a);// 填充buff的半区函数 2.程序源代码 #includestdio.h #includestdlib.h #includestring.h #includemath.h int pointer=0;// int i=0,j=0,c=0,appear,d=0,num_location;// int row_num=0,letter_num=0,word_num=0; int z=1; char C= ;// char token[30];// char buff[4095];// char token_list[200][30];// char number[200][10];// char next_charac,charac,file_name[20]; char keywords[32][10]={auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeo,fstatic,struct,switch,typedef,union,unsigned,void,volatile,while}; double num; FILE *file_pointer; void fillBuffer(int a)// { // i=0; while((!feof(file_pointer)) i2048){// buff[a+i]=charac; if(charac!= ){// if(charac==\n){ row_num++;// } else{ letter_num++;

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档