《词法分析器设计(共11页).doc》由会员分享,可在线阅读,更多相关《词法分析器设计(共11页).doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上学 号 编译原理实验1:词法分析器设计学生姓名专业、班级指导教师成绩计算机与信息工程学院2018 年 11 月 20 日一、实验目的1. 理解词法分析程序的功能。2. 熟悉词法分析程序的设计原理和构造方法。3. 理解词法分析程序输出单词的形式。4. 设计实现针对简单语言的一个词法分析程序。二、实验要求1. 根据书P199给出的简单语言的词法和各单词符号种别码表,编写C或C+语言源程序,实现针对该简单语言的词法分析器;2. 独立做实验,输入、调试所编程序;3. 实验结束后,根据实验报告模板编写实验报告。三、实验内容和步骤用 Visual C+作为实验开发环境,创建一个W
2、in32 Console Application工程,工程名为你的学号,添加三个文件:(1)存储结构定义:以LexerDef.h为文件名; (2)基本操作和算法:以LexerAlgo.h为文件名; (3)调用基本操作的主程序:以LexerMain.cpp为文件名。编写程序:(1)文件LexerDef.h定义单词符号的二元组结构、全局变量、关键字表的结束标志等。(2)文件LexerAlgo.h实现词法扫描算法scanner及其所需的各种基本操作算法。(3)文件LexerMain.cpp调用scanner算法,实现词法分析器的功能。源程序代码:=LexerDef.h=#define _KEY_WO
3、RD_END waiting for your expandingtypedef structint typenum;char * word;WORD;=LexerAlgo.h=#includeLexerDef.hchar input50=;char token255=;int p_input;int p_token; char ch;char * rwtab=begin,if,then,while,do,end,_KEY_WORD_END;/从输入缓冲区读取一个字符到ch中char m_getch()ch=inputp_input;p_input=p_input+1;return(ch);/
4、去掉空白符号void getbc()while(ch= |ch=10)ch=inputp_input;p_input=p_input+1;/拼接单词void concat()tokenp_token=ch;p_token=p_token+1;tokenp_token=0;/判断是否字母int letter()if(ch=a&ch=A&ch=0&chtypenum=10;myword-word=;p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword-type
5、num=reserve();myword-word=token;return(myword);else if(digit()while(digit()concat();m_getch();retract();myword-typenum=20;myword-word=token;return(myword);else switch(ch)case =:m_getch();if(ch=)myword-typenum=39;myword-word=;return(myword);retract();myword-typenum=21;myword-word=;return(myword);brea
6、k;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);brea
7、k;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 ,
8、: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=
9、;return(myword);retract();myword-typenum=35;myword-word=;return(myword);break;case typenum=38;myword-word=typenum=36;myword-word=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(mywor
10、d);break;default:myword-typenum=-1;myword-word=ERROR;return(myword);=LexerMain.cpp=#include#include#include#includeLexerAlgo.hWORD * scaner();void main(void)int over=1;WORD* oneword=new WORD;printf(Enter Your words(end with #):);scanf(%#s,input);p_input=0;printf(Your words:n%sn,input);while(overtype
11、numtypenum,oneword-word);over=oneword-typenum;printf(npress # to exit:);scanf(%#s,input);四、解答下列问题(1)简述词法分析器的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。1.主程序示意图关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Ch
12、ar *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”;置初值调用扫描子程序输出单词二元组输入串结束 否 是结束 程序需要用到的主要变量为syn,token和sum。2. 扫描子程序的算法思想 首先设置3个变量:(1)token用来存放构成单词符号的字符串;(2)sum用来存放整型单词(3)syn用来存放单词符号的种别码。(2)画出词法扫描算法scanner识别简单语言的状态转换图DFA(可手画再插入图片)(3)解释子程序reverse的每句代码含义 reserve函数的作用是遍历关键字表格,判断当前存入token的字符串是否是关键字首
13、先先设定一个初值为0的变量i(存在于while外部,会因为循环内部的操作而进行改变)while条件内部完整代码应为:while(strcmp(rwtabi,_KEY_WORD_END)!=0),strcmp函数的作用是判断两个字符串是否相等:设两个字符串str1,str2,若str1=str2,则返回零;若str1str2,则返回正数。已知关键字表格中最后一个元素为_KEY_WORD_END,所以这行代码的意思就是,从关键字表格中第一个字符串开始遍历(循环一次后i+),遍历到最后一个通过strcmp函数运算等于零不满足循环条件所以跳出循环。循环体内部if当前字符串和遍历到的关键字进行比较,两者
14、相等时满足条件(!0!=0),相等时返还i+1。最后返还10(关键字的种别码)(4)针对文件LexerMain.cpp中main函数的while(over1000&over!=-1)语句,解释over的含义及何时over = -1? while(over0 then x:=2*x+1/3; end #实验结果截图:(2)输入一段此简单语言的源程序,要求每人不同,且包含单词符号while -源程序:begin x:=31;while x13 then x-;end#实验结果截图:六、实验中遇到的问题及解决方法 本次实验的任务是用C+编写一个词法分析器,词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本次实验,我了解了词法分析器的工作原理和功能以及实现方法。但是在写程序的过程中,对于C语言的运用不太熟练,还需要查找一些资料来完成。 专心-专注-专业