《编译原理词法分析器实验报告.doc》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告.doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一、实验目的设计一个简单的词法分析器,从而进一步加深对词法分析器工作原理的理解。二、实验要求1、该个词法分析器要求至少能够识别以下几类单词:(1)关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写;(2)标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;(3)常数:NUM = digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|
2、9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等;(4)专用符号:+ - * / = = != = ; , ( ) /* */;2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。三、实验环境实验环境为win7系统、vs2005。四、实验内容1、词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token)或(sum或fsu
3、m,对应二进制)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数;fsum为浮点型常数。2、各种单词符号种别码如下表:单词符号种别码 单词符号种别码119if2=20int3=21return4=22void5!=23while6;24lettet(letter|digit)*10,25整型常量11(26浮点常量12)27+13281429*1530/163117/*32=18*/33五、主要函数说明1、程序全局变量char inputstr300,token8;/分别存放程序段、构成单词符号的字符串char ch;/输入字符int syn;/单词字
4、符的种别码int p;/缓冲区inputstr的指针int sum;/整型常量float fsum;/浮点型常量char *rwtab6=else,if,int,return,void,while;/关键字数组2、语法分析函数void scaner()该函数完成所有的语法分析,对于输入的程序片段,首先去掉空格和换行,然后逐字符分析,找出各个单词(存入token8),判别它们的类型(确定syn值,如果是整数则是sum值,如果是浮点数则是fsum)。此函数的主要流程图如下:变量初始化忽略空格程序是否结束? 返回 是 是拼字符串是否关键字?syn为对应关键字的单词种别码syn=10报错否字母 数字
5、其他拼数运算符、 符号界符等符号返回对不同符号给出相应的syn值是否含小数点? 否 是Syn=12syn=111void scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; ch=inputstrp+;/printf(%-d,p); m=0; while(ch= )|(ch=n)ch=inputstrp+;/去掉空格和换行 if(ch=a)|(ch=A)/识别标识符 while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch; ch=inputstrp+; p-; syn=10; for(n=0;n=0)&(ch=0)&(ch=0
6、)&(ch=0)&(ch=0)&(ch=0)&(ch=9) fn=fn*10+ch-0; tokenm+=ch;ch=inputstrp+; p-; po=pow(base,-fn);/printf(%-f %f %d,fsum,po,fn); fsum=fsum*po;else/printf(bbbbbbbbbbb);syn=-1;/p-;/ch=inputstrp+;printf(%-s,ch); 3、主函数主函数中,首先接收用户输入的程序段,将其存入全局变量inputstr中。接着调用scaner()函数,循环直到分析完所有字符。每次循环中,判断syn的值,如果是11就输出整数,如果是1
7、2就输出浮点数,如果是1则表示出错退出程序,默认是输出标识符、界符等。scaner();/分析= switch(syn) case 11:printf( %-10s,token); bit_print(sum);/输出整数 printf( )n); break; case 12:printf( %-10s,token); float_bit_print(fsum);/输出浮点数 printf( )n); case -1:printf(出错!错在%-sn,token);/出错 exit(0); default: printf( %-10s%5d )n,token,syn);/输出标识符、界符等 break;六、实验结果1、整体测试输入以下程序段,得到的结果如图1:void main()float a=3.14,b=4.56;float sum;sum=a+b;printf(“%f”,sum);图12、测试注释的识别输入一段带注释的程序,测试结果如图2:图2七、实验总结本程序实现了词法分析的功能,能对用户输入的程序段进行词法分析,达到了实验要求。通过实验,加深了对词法分析过程的理解,了解了词法分析程序的工作原理。但该程序有一些不足,比如实现比较简单,某些地方与预期运行结果可能有些出入。8