资源描述:
《实验二词法分析器》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、魏陈强23020092204168实验二词法分析器一、实验目的掌握词法分析器的构造原理,掌握手工编程或LEX编程方法之一。二、实验内容编写一个词法分析器,能够输入的源程序转换为单词序列输出。三、实验要求1.可以采用手工或LEX开发工具,采用VC环境。2.源语言定义见教材附录A.1,其中的终结符即词法分析需要得到的tokens。(1)该语言的关键字:ifwhiledobreakrealtruefalseintcharboolfloat(其中,int、char、boolean、float在产生式中为basic)所有的关键字都是保留字,并且必须是小写。(2)id和num的正则表达式定义;
2、(3)专用符号:+-*/<<=>>===!==;,()[]{}/**/(4)空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。(5)考虑注释。注释由/*和*/包含。注释可以放在任何空白出现的位置,且可以超过一行。注释不能嵌套。3.实现词法分析器的注意要点:(1)关键字和标识符名的区别;(2)数字的转换处理;(3)“>=”和“>”这类单词的处理;四、实验思路本次实验,打算两种方法都使用。1、采用LEX开发工具编写,熟悉LEX语言的编写格式即可。2、手工编写定义一个关键字数组,预先存入所以可能出现的关键字,并分别创建两个关键字表、ID表、num表、专用符
3、号表、注释表,以及一个作为缓存的数组。采用命令行读入语句形式,读入一行语句,设置while(1)循环分别读取每个字符,以‘’作为结束。读入一个字符,判断其属于哪个类别,然后通过调用函数转向那个类别所属的子程序去执行。比如,读入一个字符,判断出为字母,因此调用voidalpha();进入字母处理子程序去,读取下个字符,如果为字母或者数字,则继续往下读,直到其既不是字母也不是数字为止,然后将从上个断点开始到目前为止的字符串存入缓存数组,并且把该缓存数组和关键字数组逐一比对,若该字符串为关键字,则存入关键字表,否则存入ID表。同理,如果接下去遇到数字,则转入voiddigit();中
4、去,取得一个字符串后,判断字符串中是否有字母,如果有则存入ID表,如果没有,则存入digit表,即数字表。如果接下去遇到't'和'',则不做动作。如果遇到'/',则转入voidnote();判断是否是注释,在注释判断中,通过判断字符串是否以/*开头并且以*/结尾,如果是,则存入注释表中,如果不是,则报错,因为出现了非法字符。最后,如果是都不属于上面任何一种情况的字符,则转入voidotherchar();去判断是否是专用符号,voidotherchar();中使用switchcase,列出所有的专用符号。在遇到>或者<时,应该继续判断下一个字符是否是=,如果是,则匹配<=或>=。
5、如果对case中所有情况都不满足,则输出错误,因为出现了非法字符。当语句扫描结束后,各个表中已经有了语句中出现的所有类型的字符串,现在要做的就是把各个表中重复出现的字符串去掉,通过分别再建一个与原表一样大小的表,如果原表中有东西,则把第一项复制到新表中,然后取原表第二项(如果有),与新表中所有项比较,如果都不一样,则加入新表,否则不加入,继续取下个项。最后输出各个表内容即可。四、实验代码1、手工编写#include#include#includechar*keyword[8]={"if","for","else","while
6、","do","float","int","break"};charkeywordtable[20][20],re_keywordtable[20][20];chardigittable[20][20],re_digittable[20][20];charotherchartable[20][20],re_otherchartable[20][20];charidtable[20][20],re_idtable[20][20];charnotetable[20][20];charword[20];voidinitialize();voidalpha();voiddigit();vo
7、iderror();voidotherchar();voidprint();voidcheck();voidnote();intdigit_num=0,keyword_num=0,otherchar_num=0,id_num=0,note_num=0;intredigit_num=1,rekeyword_num=1,reotherchar_num=1,reid_num=1;intflag_error=0;charlookahead;voidmain(){printf(