资源描述:
《编译原理实验报告-词法分析器构造》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实验报告实验题目:词法分析器构造指导教师:段青松姓名:班级:学号:实验成绩:实验题目词法分析器构造实验目的和要求总体任务:通过对给定源语言词法分析程序的设计,加深对词法分析原理的理解,掌握源语言的接受、存贮、预处理和扫描分析,生成正确的单词符号串二元式序列。说明提示:1.本实验要求的直接分析法,即从左向右扫描源程序,一旦发现有独立意义的字符串时,即将其改造统一长度的二元组(t,i)输出,其中t表示单词种别,i为相应内部表示,本题t分为五类:K(关键字)、I(标识符)、C(常数)、P(界符),L(标号)i为特定项的指针值,对应于每一类属性的单词均设置相应的有贮表格,在识
2、别过程中每识别出一个单词,则将其顺序放入相应的符号表中。2.源程序利用行编辑录入,以TEXT文件形式存贮在盘上,词法分析程序,先对源程序作预处理扫描生成新的TEXT文件。预处理的功能是剔除无用的空白、跳格、回车和换行等编辑性字符;去掉注解部分,连接继续行,给出句未符。3.本实验作为编译过程的第一阶段和后续实验的前提,所有生成结果都必须作为永久文件存贮。设计思想与框架词法分析时,首先要对源程序进行预处理,去掉的多余的空格符号和注释,其中注释要删除,多个空格变成一个,并在结尾加一个标识符如#,用来表示结束。预处理阶段结束,再进行逐词分析。若第一位是字母,则他可能是关键字、标号、标
3、示符;若第一位是数字,则可能是常数、标号、非法标号;若为其他字符,则可能是界符、运算符、关系符、或非法字符。这样细分后再进行查表判断。核心算法定义符号表:char*keyword[4]={"IF","THEN","ELSE","GOTO"};char*operatornum[4]={"+","-","*","/"};char*comparison[6]={">","<",">=","<=","=","<>"};char*interpunction[4]={",",":","(",")"};主要函数:boolsearch(charsearchstr[],intwordtype)
4、charletterprocess(charch)//isalnum判断是否为字母或者数字charnumberprocess(charch)//数字charotherprocess(charch)//数字,字母,非括号charprocess(charch)//读字符voidpro_process(char*buf)//预处理voidmain()//主函数源程序及注释#include#include#include#include#include#include#i
5、nclude#include#defineNULL0FILE*fp;FILE*out,*in;charch;charfilename[50];char*keyword[4]={"IF","THEN","ELSE","GOTO"};char*operatornum[4]={"+","-","*","/"};char*comparison[6]={">","<",">=","<=","=","<>"};char*interpunction[4]={",",":","(",")"};intx=-1,y=-1,z=-1;#defineKl
6、en10#defineIlen30#defineClen40#definePlen20#defineOlen20#defineLlen10charK[Klen][10],P[Plen][2],I[Ilen][20],O[Olen][2];intC[Clen],L[Llen];boolsearch(charsearchstr[],intwordtype){inti;switch(wordtype){case1:for(i=0;i<=3;i++){if(strcmp(keyword[i],searchstr)==0)returntrue;}case2:for(i=0;i<=3;i
7、++){if(strcmp(operatornum[i],searchstr)==0)returntrue;}case3:for(i=0;i<=5;i++){if(strcmp(comparison[i],searchstr)==0)returntrue;}case4:for(i=0;i<=3;i++){if(strcmp(interpunction[i],searchstr)==0)returntrue;}}returnfalse;}charletterprocess(charch)//isalnum