资源描述:
《编译原理词法分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算机科学与工程学院计算机033班曾志强22号词法分析一、实验目的1、熟悉词法分析原理,掌握词法分析方法。2、熟悉状态转换图,掌握词法分析器设计方法。二、实验内容本实验的任务是编写一个c语言单词子集的词法分析程序,它从左至右逐个字符地对c语言子集源程序进行扫描,产生一个个的单词符号的机内表示。(c语言子集的单词说明见书P11)在此,将词法分析作为单独的一遍,如图1所示。图1具体任务有:●组织源程序的输入。●拼出单词并转换成机内表示形式,形成单词序列、符号表和整常数表。●删除注释、空格和无用符号。●发现并定位词法错误,打印
2、错误信息。三、实验要求1、能对任何C语言子集源程序进行分析为此,在运行词法分析程序时,应用问答方式输入要被扫描的c语言子集源程序的文件名,然后对该源程序完成词法分析任务。2、能检查并处理某些词法错误词法分析程序应给出的错误信息包括:总的出错个数,每个错误所在的行号、错误9/9计算机科学与工程学院计算机033班曾志强22号编号及错误说明。一般错误处理包括:跳过错误,给出错误信息,继续词法分析。本实验最基本要求是发现第一个错误后停止词法分析,输出错误所在位置(如输出:错误(第X个字符,字符),或,错误(行号,列号,字符))。
3、四、输入输出1、输入c语言子集源程序,为文本文件。注意读到文件结束符EOF意味着分析结束。2、输出词法分析程序的运行结果是:输出一个单词序列(屏幕显示或保存在文件中)和一个常数表、一个符号表(屏幕显示或保存在文件中)、一个常数表(屏幕显示或保存在文件中),并输出错误信息。例:输入源程序src.cabc=134if(abc==5)d=c+1输出显示:/*‘(’和’)’种别编码分别为14,15*/符号表:(1,abc)(2,d)(3,c)常数表:(1,134)(2,5)(3,1)单词序列:(6,1)(12,-)(7,1)(2
4、,-)(14,-)(6,1)(11,3)(7,2)(15,-)(6,2)(12,-)(6,3)(8,-)(7,3)五、程序代码/*程序实现C语言词法分析器的设计*//*用到的几个函数GetNextWord()从字符串中得到一个单词GetC()从当前流中取一个字符Pushback()退回字符SearchKey()查找保留字表/*用到的变量cch放当前字符flag标志有无退回字符(1:有0:无)bchar放退回字符9/9计算机科学与工程学院计算机033班曾志强22号/*C语言中的保留字(32个)autobreakcasech
5、arconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile/*运算符(43个)()[]{}->.!~++---*&/%+<<>><<=>>===!=^
6、&&
7、
8、?:=+=-=*=%=>>=<<=&=^=!=
9、=,*/#include#include10、h>#include#includeintflag=0;charcch;charbchar;charstr[100];FILE*fp;voidPushback(charc){bchar=c;flag=1;}charGetC(){if(flag==1){flag=0;returnbchar;}chart;t=getc(fp);if(t==''
11、
12、t=='t'
13、
14、t=='r')t='';returnt;}intSearchKey(){charStrToken[32][10]
15、={"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch",9/9计算机科学与工程学院计算机033班曾志强22号"typedef","union","unsigned"
16、,"void","volatile","while"};for(inti=0;i<32;i++){if(strcmp(StrToken[i],str)==0)returni;}return0;}voidGetNextWord(){cch=GetC();while(cch==''){cch=GetC();}intk=0