《编译实验词法分析.doc》由会员分享,可在线阅读,更多相关《编译实验词法分析.doc(12页珍藏版)》请在金锄头文库上搜索。
1、词法分析器实验报告院 系: 专 业: 小组成员: 学 号: 日 期: 一、实验的目的与任务词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。基本符号是与输入的语言定义的词法所规定的终结符。本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续进行)。二、实验所要识别的单词分类1关键字。*key53= auto, bool, break, case, catch, ch
2、ar, class, const, continue, default, delete, do, double, else, enum, extern, false, float, for, friend, goto, if, inline, int, long, namespace, new, operator, private,protected, public, register, return, short, signed, sizeof, static, struct, switch,template, this, throw, true, try, typedef, typenam
3、e, union, unsigned, using, virtual, void, volatile, while;2标识符。符合文法标识符,由字符和数字组成,首字符必须为下划线或字母。(hjw, wyp2319,_zhg.)3.数字。整型,浮点型,科学计数。4.运算符。*arithmetic6=+ , - , * , / , + , -; 5.关系运算符。*relation7= , , = , = ,!=;6.分界符。*border7= , , ; , , , ( , ) ,/; 三、输出格式1)若为关键字,则输出格式为;例:关键字float,输出为2)若为一般标识符,则输出格式为;例:标识
4、符fzu,输出为3)若为数字,则输出格式为;例:数字2325,输出为4)若为算术运算符,则输出格式为;例:+,输出为5)若为关系运算符,则输出格式为;例:!=,输出为6)若出错,则输出格式为;例:错误输入为26.,则输出为四、正则表达式: 标识符 id-letter_(letter_|digit)* 无符号数 number-digit optitionalfraction optionalexponent 空白符 ws-(blank|tab|newline)+ 关系运算符 relop- |=|=|!= 运算符 operator-+|-|*|/|+|-五、DFA 状态转换图start=123ot
5、her=*return(relop, NE)return(relop, LT)return(relop, EQ)return(relop, GE)return(relop, GT)startletter9other1110letter/dig*1912141316151817startotherdigit.digitE+ | -digitdigitdigitdigitEdigit*start+25+other*-262728293332other3031-*/六、流程图七、实验结果实验环境:Microsoft Windows 7下的Microsoft Visual Studio 2010输入输
6、出输入输出输入输出八、结果分析用格式为.txt的文件输入,一个个字符去识别,根据DFA的状态图实现跳转,把未进入接受状态的单元存放进一个数组,到达接受状态,将识别出来的词和属性一起输出。其中识别得到的id与keyword转换过程相同,故最后得到的结果还要再判断是标识符还是关键字。由于关键词有限,可以建个表存放关键字,通过查表实现判断关键字。运算符和分隔符是有限的,所以把它们罗列去判断,只要是符合条件就接收。 九、实验总结实验是理论的实践,但是通过实验加深了我们对理论课知识的理解和运用,词法分析器更是如此。对输入的程序进行分析,将关键字,保留字与系统标识符分开,并对属性进行说明。更通俗的来说,也
7、就是编写一个程序,可以实现这个功能。通过这个实验,现在我们知道了,如何用正则表达式去识别我们想要识别的单词。但如何用程序去实现整个识别过程,又该如何去一步步执行识别呢?最简单的方法,一个字符一个字符的读入,每读入一个字符,识别过程进入一个特定的状态,按照一定的次序在一系列状态间转换后,字符全部读入,状态也走入了终态。那么好了,一个单词识别完毕,这就给我们启示,从一个状态转换图可以较容易的实现程序化的识别工作。这样我们就知道如何从一个状态图去写程序了。十、实验代码#include stdafx.h#include #include #include #include #include using
8、 namespace std;ifstream fp(in.txt,ios:in);char cbuffer;char *key53= auto, bool, break, case, catch, char, class, const, continue, default,delete, do, double, else, enum, extern, false, float, for, friend, goto, if, inline, int, long, namespace, new, operator, private,protected, public, register, ret
9、urn, short, signed, sizeof, static, struct, switch,template,this, throw, true, try, typedef, typename, union, unsigned, using,virtual,void,volatile,while; /关键字char *border7= , , ; , , , ( , ) ,/; /分界符char *arithmetic6=+ , - , * , / , + , -; /算术运算符char *relation7= , , = , = ,!=; /关系运算符 int search(cha
10、r searchchar,int wordtype)/search函数查表匹配 int i=0,t=0;switch (wordtype)case 1: for (i=0;i=52;i+) /关键字if (strcmp(keyi,searchchar)=0)return(i+1);return(0);case 2:for (i=0;i=6;i+) /分界符if (strcmp(borderi,searchchar)=0)return(i+1); return(0);case 3:for (i=0;i=5;i+) /运算符if (strcmp(arithmetici,searchchar)=0)
11、return(i+1);return(0);case 4:for (i=0;i=6;i+) /关系运算符if (strcmp(relationi,searchchar)=0)return(i+1);return(0);char alphaprocess(char buffer) /字符处理过程int i=-1;char alphatp20;while (buffer=_|(isalpha(buffer)|(isdigit(buffer)/这两个函数分别是判字符和判数字函数位于ctype.h中alphatp+i=buffer;buffer=fp.get();alphatpi+1=0;/在末尾添加字符串结束标志if ( search(alphatp,1)coutalphatpendl;else coutalphatpendl;/