资源描述:
《实验一:词法分析程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实验报告院系:000000姓名:0000班级:0000000 学号: 00000000 题目:词法分析器完成日期:2014年10月8日实验一:词法分析程序设计【开发语言及实验环境】开发语言:C/C++/C#实验环境:MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2005【实验目的】1、理解词法分析在编译程序中的作用2、加深对有穷自动机模型的理解3、掌握词法分析程序的实现方法和技术【实验要求】对一个简单的语言的子集编制一个一遍扫描的词法分析程序。【实验内容】1、待分析
2、的简单语言词法(1)关键字可以自由添加。如C语言的关键字:mainifelseintcharreturnvoidwhile等。(2)标识符(ID)ID→letter(letter
3、digit)*Letter→a
4、…
5、z
6、A
7、…
8、Zdigit→0
9、…
10、9(3)常数(可以先以整形常数为例)NUM→digit(digit)*digit→0
11、…
12、9(4)运算符如C语言中的运算符=+-*/<<=>>===!=等。(5)界符如C语言中的;:,{}[]()等。空格由空白、制表符和换行符组成。空格一般用来分隔关键字、ID、NUM、运算符和界符
13、。词法分析阶段空格通常被忽略。2、各种单词类别及对应的种别编码关键字设置为0~99,如“main”设置为0,“if”设置为1,……;标识符设置为100;常数设置为101~109,如整形常数设置为101,小数常数设置为102,……;运算符设置为110~149,如“=”设置为111,“+”设置为112,……;界符设置为150~159,如“;”设置为150,“,”设置为151,……。3、词法分析程序的功能输入:所给文法的一段源程序字符串输出:二元组(syn,token)构成的序列。syn为单词种别码;token为存放的单词自身字符串
14、;例如:对源程序intx=9;if(x>0)x=2*x+1/3;经词法分析后输出如下序列:(3,int)(1,‘x’)(4,=)(2,9)……4、主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符种类,拼出相应的单词符号。(1)主程序示意结构图:输出单词二元组置初值调用扫描子程序结束(2)扫描子程序(scanner)的算法思想是否关键字FT是否为运算符、界符等拼数FTFTsyn=20syn=10syn为对应关键字的类别码错给出相应的syn值5、关键字表置初
15、值关键字作为特殊标识符处理,把它们预先安排在一张表格中(关键字表),当扫描程序识别标识符时,查关键字表。如能查到匹配的单词,则为关键字,否则为一般标识符。6、调试程序,验证输出结果。【思考题】1、在编程过程中遇到了哪些问题,你是如何解决的。2、源程序若存在注释,如何实现词法分析,在现有程序基础上进行扩充。功能测试:1.输入字符串@#其结果显示如下:2.输入字符串^^^^^^#其结果显示如下:3.输入字符串1234#其结果显示如下:源代码如下:#include#includecharprog
16、[80],token[6];charch;intsyn,p,m,n,sum;char*rwtab[8]={"begin","if","then","while","do","end","start","for"};main(){p=0;printf("你好,请输入:");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case11:printf("(%d,%d)",syn,sum);break;case-1:printf("i
17、nputerror");break;default:printf("(%d,%s)",syn,token);}}while(syn!=0);getch();}/*词法扫描程序:*/scaner(){for(n=0;n<8;n++)token[n]=NULL;m=0;ch=prog[p++];while(ch=='')ch=prog[p++];if((ch<='z'&&ch>='a')
18、
19、(ch<='Z'&&ch>='A')){while((ch<='z'&&ch>='a')
20、
21、(ch<='Z'&&ch>='A')
22、
23、(ch
24、<='9'&&ch>='0')){token[m++]=ch;ch=prog[p++];}token[m++]=' ';ch=prog[--p];syn=10;for(n=0;n<8;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;bre