您好,欢迎访问三七文档
学号《编译原理》实验1:词法分析器设计学生姓名专业、班级指导教师成绩计算机与信息工程学院2018年11月20日一、实验目的1.理解词法分析程序的功能。2.熟悉词法分析程序的设计原理和构造方法。3.理解词法分析程序输出单词的形式。4.设计实现针对简单语言的一个词法分析程序。二、实验要求1.根据书P199给出的简单语言的词法和各单词符号种别码表,编写C或C++语言源程序,实现针对该简单语言的词法分析器;2.独立做实验,输入、调试所编程序;3.实验结束后,根据实验报告模板编写实验报告。三、实验内容和步骤用VisualC++作为实验开发环境,创建一个Win32ConsoleApplication工程,工程名为你的学号,添加三个文件:(1)存储结构定义:以LexerDef.h为文件名;(2)基本操作和算法:以LexerAlgo.h为文件名;(3)调用基本操作的主程序:以LexerMain.cpp为文件名。编写程序:(1)文件LexerDef.h定义单词符号的二元组结构、全局变量、关键字表的结束标志等。(2)文件LexerAlgo.h实现词法扫描算法scanner及其所需的各种基本操作算法。(3)文件LexerMain.cpp调用scanner算法,实现词法分析器的功能。源程序代码:===============================LexerDef.h===============================#define_KEY_WORD_ENDwaitingforyourexpandingtypedefstruct{inttypenum;char*word;}WORD;==============================LexerAlgo.h===============================#includeLexerDef.hcharinput[50]=;chartoken[255]=;intp_input;intp_token;charch;char*rwtab[]={begin,if,then,while,do,end,_KEY_WORD_END};//从输入缓冲区读取一个字符到ch中charm_getch(){ch=input[p_input];p_input=p_input+1;return(ch);}//去掉空白符号voidgetbc(){while(ch==''||ch==10){ch=input[p_input];p_input=p_input+1;}}//拼接单词voidconcat(){token[p_token]=ch;p_token=p_token+1;token[p_token]='\0';}//判断是否字母intletter(){if(ch='a'&&ch='z'||ch='A'&&ch='Z')return1;elsereturn0;}//判断是否为数字intdigit(){if(ch='0'&&ch='9')return1;elsereturn0;}//检索关键字表格intreserve(){inti=0;while(strcmp(rwtab[i],_KEY_WORD_END)){if(!strcmp(rwtab[i],token)){returni+1;}i++;}return10;}voidretract(){p_input=p_input-1;}char*dtb(){returnNULL;}WORD*scaner(){WORD*myword=newWORD;myword-typenum=10;myword-word=;p_token=0;m_getch();getbc();if(letter()){while(letter()||digit()){concat();m_getch();}retract();myword-typenum=reserve();myword-word=token;return(myword);}elseif(digit()){while(digit()){concat();m_getch();}retract();myword-typenum=20;myword-word=token;return(myword);}elseswitch(ch){case'=':m_getch();if(ch=='='){myword-typenum=39;myword-word===;return(myword);}retract();myword-typenum=21;myword-word==;return(myword);break;case'+':myword-typenum=22;myword-word=+;return(myword);break;case'-':myword-typenum=23;myword-word=-;return(myword);break;case'*':myword-typenum=24;myword-word=*;return(myword);break;case'/':myword-typenum=25;myword-word=/;return(myword);break;case'(':myword-typenum=26;myword-word=(;return(myword);break;case')':myword-typenum=27;myword-word=);return(myword);break;case'[':myword-typenum=28;myword-word=[;return(myword);break;case']':myword-typenum=29;myword-word=];return(myword);break;case'{':myword-typenum=30;myword-word=};return(myword);break;case'}':myword-typenum=31;myword-word=};return(myword);break;case',':myword-typenum=32;myword-word=,;return(myword);break;case':':m_getch();if(ch=='='){myword-typenum=18;myword-word=:=;return(myword);}retract();myword-typenum=33;myword-word=:;return(myword);break;case';':myword-typenum=34;myword-word=;;return(myword);break;case'':m_getch();if(ch=='='){myword-typenum=37;myword-word==;return(myword);}retract();myword-typenum=35;myword-word=;return(myword);break;case'':m_getch();if(ch=='='){myword-typenum=38;myword-word==;return(myword);}retract();myword-typenum=36;myword-word=;return(myword);break;case'!':m_getch();if(ch=='='){myword-typenum=40;myword-word=!=;return(myword);}retract();myword-typenum=-1;myword-word=ERROR;return(myword);break;case'\0':myword-typenum=100;myword-word=OVER;exit(0);return(myword);break;default:myword-typenum=-1;myword-word=ERROR;return(myword);}}==============================LexerMain.cpp=============================#includestdio.h#includestdlib.h#includestring.h#includeLexerAlgo.hWORD*scaner();voidmain(void){intover=1;WORD*oneword=newWORD;printf(EnterYourwords(endwith#):);scanf(%[^#]s,input);p_input=0;printf(Yourwords:\n%s\n,input);while(over1000&&over!=-1){oneword=scaner();if(oneword-typenum1000)printf((%d,%s),oneword-typenum,oneword-word);over=oneword-typenum;}printf(\npress#toexit:);scanf(%[^#]s,input);}四、解答下列问题(1)简述词法分析器的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。1.主程序示意图○1关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char*rwtab[6]={“begin”,“if”,“then”,“while”,“do”,“end”};否是置初值调用扫描子程序输出单词二元组输入串结束结束○2程序需要用到的主要变量为syn,token和sum。2.扫描子程序的算法思想首先设置3个变量:(1)token用来存放构成单词符号的字符串;(2)sum用来存放整型单词(3)syn用来存放单词符号的种别码。(2)画出词法扫描算法scanner识别简单语言的状态转换图DFA(可手画再插入图片)(3)解释子程序reverse的每句代码含义reserve函数的作用是遍历关键字表格,判断当前存入token的字符串是否是关键字○1首先先设定一个初值为0的变量i(存在于while外部,会因为循环内部的操作而进行改变)○2while条件内部完整代码应为:while(strcmp(rwtab[i],_KEY_WORD_END)!=0),strcmp函数的作用是判断两个字符串是否相等:设两个字符串str1,str2,若str1==str2,则返回零;若str1str2,则返回负数;若str1str2,则返回正数。已知关键字表格中最后一个元素为_KEY_WORD_END,所以这行代码的意思就是,从关键字表格中第一个字符串开始遍历(循环一次后i++),遍历到最后一个通过strcmp函数运算等于零不满足循环条件所以跳出循环。○3循环体内部if当前字符串和遍历到的关键字进行比较,两者相等时满足条件(!0!=0),相等时返还i+1。○4最后返还10(关键字的种别码)(4)针对文件LexerMain.cpp中main函数的while(over1000&&over!=-1)语句,解释over的含义及何时over==-1?while(over1000&&over!=-1)当while中的语句满足条件时继续循环,循环体内内容为:读取一个新单词,并输出他的(种别码,单词自身的值)的二元组,并把当前单词的种别码的值赋值给over;当出现了字符串的终结位置位1000,错
本文标题:词法分析器设计
链接地址:https://www.777doc.com/doc-5347946 .html