《编译原理_词法分析器实验报告》由会员分享,可在线阅读,更多相关《编译原理_词法分析器实验报告(8页珍藏版)》请在金锄头文库上搜索。
1、一 实验题目和要求。题目:设计 PL / 0 语言的词法分析器。要求:单词(关键字);begin end if then else while write read do call const var procedure repeat until运算符:+ - * / := = (#) =界符: , . ; ( )标识符:字母打头的字母数字串,长度不超过 10.常数:整数,所含数字的个数不超过 14.返回单词形式: 二元式(种别,属性值)二 实验平台。PC 机: Windows XP 操作系统编程环境: Turbo C 2.0编程语言: C 语言三 实验算法说明。定义 2 个全局变量 char
2、 ch 和 char strtoken 分别用来存放最新读入的源程序字符和构成单词符号的字符串。然后用各个子函数的功能和读文件内容的操作,实现对源程序的词法分析,分别进行关键字,标识符,常数,运算符和界符的分析确认,然后将对应的二元式结果输出。首先用户输入要读文件的名称,然后程序会把文件的内容读到定义的够大的字符数组 str(相当于词法分析的一个缓冲区)里,然后开始从 str 里一个一个的读出字符并放在专门用来暂时存放单词数组 strtoken 里进行词法分析,若符合语言的规则,则打印出相关的说明信息,即该字符或字符串的二元式信息,可以清楚的明白该字符的种别和属性值。如果读入的字符或字符串是非
3、法的,即不是语法规定或是没有意义的字符或字符串,程序会提示相关的错误信息并进行一定的说明。四 程序子函数功能说明。1. void getChar( ) 将下一个输入字符读到 ch 中,搜索指示器前移一个字符的位置。2. void getBc( ) 检查 ch 中的字符是否为空白,若是,则调用 getChar( ),直到 ch 中进入一个非空的字符。3. void retract( ) 将搜索指示器回调一个字符位置,将 ch 置为空白字符。4. void concat( ) 将 ch 中的字符连接到 strtoken 之后。5.int Isletter( ) 子函数过程,判断 ch 中的字符是否
4、为字母。6.int Isdigit( ) 子函数过程,判断 ch 中的字符是否为数字。7. int Iskey_ch( ) 子函数过程,判断 strtoken 中的字符串是否为程序设计语言的关键字,若是,打印并返回它的二元式。8. void Isident( ) 子函数过程,判断 strtoken 中的字符串是否为程序设计语言规定的标识符。9. void empty( ) 将 strtoken 字符数组置空,然后接收下一个字符并分析。10. void Isnum( ) 子函数过程,判断 strtoken 中的字符串是否为数字串常量,若是,打印并返回它的二元式。11. void error( )
5、 子函数过程,判断 ch 中的字符是否为非法字符,若是,则打印该非法字符并提示。12. int Isjiefu( ) 子函数过程,判断 strtoken 中的字符串是否为程序设计语言语法规定的界符。13. int Issuanfu( ) 子函数过程,判断 strtoken 中的字符串是否为程序设计语言语法规定的运算符号。14. void readfile( ) 子函数过程,用户输入要分析的文件名,然后读文件操作,把文件内容读入到字符数组。五 程序源代码(C 语言):#include #include #include typedef char CH115;typedef char CH22;t
6、ypedef char NUM25;CH1 key_ch15=begin,end,if,then,else,while,write,read,do,call,const,var,procedure,repeat,until;CH1 Id15=; /定义数组,存放读出的标识符NUM num20; /定义数组,存放读出的常数CH2 key112=+,-,*,/,:=,=,=,#;CH1 key1name12=Add,Subtract,Multiple,Devide,Evaluate,Equal,Smaller,Small_equal,Bigger,Bigger_equal,Not_equal,No
7、t_equal;char key25=,.,;,(,);CH1 key2name5=Comma,Period,Semicolon,Lparenthesis,Rparenthesis;char ch; int str_cur=0; /存放文件数组的指示器int strt_cur=0; /存放用来分析数组的指示器int id_pi=0; /标识符数组指示器int num_pi=0; /常数数组指示器char str100; /用来存放文件内容的数组char strtoken15=;FILE *fp;char filename10;void getChar( ) ch=strstr_cur; str
8、_cur+; void getBc( ) if (ch= )while(ch= ) getChar( ); void readtxt( ) int i=0;FILE *fp;fp=fopen(filename,r);if(fp=NULL) /出错信息,如果文件不存在则提示错误 printf(nCan not open the file!n);getch();exit(0);while(!feof(fp)stri+=fgetc(fp); /读文件内容并复制fclose(fp);str-i=0; /结束文件内容void retract( ) str_cur-; ch= ; void concat(
9、 ) strtokenstrt_cur=ch; strt_cur+; int Isletter( ) if(ch=a&ch=A&ch=0&ch) concat( );printf(Operator: %s ($%s,-)nn,strtoken,key1name10);flag=1;return flag; else if(ch=) concat( );printf(Operator: %s ($%s,-)nn,strtoken,key1name7);flag=1;return flag; else retract( );printf(Operator: %s ($%s,-)nn,strtoke
10、n,key1name6);flag=1;return flag; else if(ch=) concat( ); getChar( );if(ch=) concat( );printf(Operator: %s ($%s,-)nn,strtoken,key1name9);flag=1;return flag; else retract( );printf(Operator: %s ($%s,-)nn,strtoken,key1name8);flag=1;return flag; else concat( );for(i=0;i10)printf(nThe length of identity
11、exceeds 10 !nn);if(!Iskey_ch( ) Isident( );empty( ); else if( Isdigit( ) while(Isdigit( ) concat( ); getChar(); retract( );if(strlen(strtoken)14)printf(nThe length of number exceeds 14 !nn);Isnum( );empty( ); else a1=Isjiefu( );if(!a1) a2=Issuanfu( );if(!a2) error( );empty( ); getch( );六 运行实例及结果:1.读
12、入文件 weihua1.c 进行分析:Please enter the name of the file: weihua1.cThe source_programme codes are:begin end procedure untilab3s pointer212 132, ; ) + / =0) b=1;else b=2;Key_word: if ($if,-)Bound_Symbol: ( ($Lparenthesis,-)Identity: a ($ID,a)Operator: = ($Bigger_equal,-)Const number: 0 ($INT,0)Bound_Symb
13、ol: ) ($Rparenthesis,-)Identity: b ($ID,b)Operator: = ($Equal,-)Const number: 1 ($INT,1)Bound_Symbol: ; ($Semicolon,-)Key_word: else ($else,-)Identity: b ($ID,b)Operator: = ($Equal,-)Const number: 2 ($INT,2)Bound_Symbol: ; ($Semicolon,-)3.读入文件 weihua3.c 进行分析:Please enter the name of the file: weihua
14、3.cThe source_programme codes are:aaabbbcccdd1234567890123456$ % &The length of identity exceeds 10 !Identity: aaabbbcccdd ($ID,aaabbbcccdd)The length of number exceeds 14 !Const number: 1234567890123456 ($INT,1234567890123456)Illegal chars: $Illegal chars: %Illegal chars: &七 实验中遇到的问题及感想。在编写词法分析器的程序中,几个子函数的功能还是比较容易实现的,但是要把它们的功能连在一起,实现对程序源代码的词法分析就困难了,例如在分析运算符的时候,有的运算符是由 2 个符号组成的,有的是 1 个,在读入一个字符的时候还要进行超前搜索,看看第二个字符是否可以和第一个字符组成一个运算符。但是在过程中遇到的问题还是没有真正清楚的明白分析的过程和一些应该考虑的问题,经过自己专心的研究和思考,最终完成了实验,实现了词法分析器的功能,对词法分析的整个过程和一些关键步骤以及出错信息的提示有了清楚的明白和理解。经过这次编译原理词法分析器的实