0120810680104 学生学号实验课成绩武汉理工大学学生实验报告书实验课程名称编译原理开课学院计算机科学与技术学院指导老师姓名饶文碧学生姓名李杰绪学生专业班级软件 0801班2010 — 2011 学年第二学期实验课程名称: 编译原理实验项目名称单词的词法分析实验成绩实验者李杰绪专业班级软件0801 组别同组者实验日期 2011 年 4月第一部分:实验分析与设计(可加页)一、实验内容描述(问题域描述)完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。
二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。
而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
2.本程序自行规定:(1)关键字"begin","end","if","then","else","while","write","read","do", "call","const","char","until","procedure","repeat"(2)运算符:"+","-","*","/","="(3)界符:"{","}","[","]",";",",",".","(",")",":"(4)其他标记如字符串,表示以字母开头的标识符。
(5)空格、回车、换行符跳过。
3、显示:输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
4、程序源代码#include<stdio.h>#include<string.h>#include<iostream.h>char prog[80],token[8];char ch;int syn,m,p=0,n,row,sum=0; char*rwtab[6]={"begin","if","then","while","do","end"};void scaner(){for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')) {sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch; ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch; ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch; ch=prog[p++];if(ch=='='){syn=17;token[m++]=ch;}else{syn=18;p--;}break;case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break;case'-':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\n':syn=-2;break;default: syn=-1;break;}}void main(){p=0;row=1;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;do{scaner();switch(syn){case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break; case -1: cout<<"Error in row"<<row<<"!"<<endl; break; case -2: row=row++;break;default: cout<<"("<<syn<<","<<token<<")"<<endl;break; }}while (syn!=0);}第二部分:实验调试与结果分析(可加页)运行结果截图1、给定源程序begin x:=9; if x>0 then x:=2*x+1/3; end#输出结果2、源程序(包括上式未有的while、do以及判断错误语句): beginx<=$;whilea<0dob<>9-x;end#输出结果beginx<=$;whilea<0dob<>9-x;end#输出结果三、主要仪器设备及耗材Windows下的visual c++6.0四、实验小结与体会通过此次实验加深了我对编译原理中词法分析过程的认识,使我在C++编程方面得到了进一步的练习,促进了我对理论联系操作的重要性的认识。
----------------下面是赠送的excel操作练习不需要的下载后可以编辑删除(Excel 2003部分)1. 公式和函数1. (1)打开当前试题目录下文件excel-10.xls;,2,利用函数计算每个人各阶段总成绩~并利用函数计算各阶段的平均成绩, ,3,“平均成绩”行数字格式都为带一位小数,例如0.0,格式, ,4,同名存盘。
步骤:a) 文件?在各阶段总成绩单元格内~点插入~点函数~在对话框中选择求和函数“SUM”~在对话中Number1内点右侧的按钮~将出现另外一个对话框~在文件中选择需要求和的单元格~然后点该对话框的右侧按钮~点确定,完成一个总成绩求和后~利用填充柄完成其他的总成绩求和~或者重复上面的顺序,?在平均成绩单元格内~点插入~点函数~选择算术平均值函数AVERAGE~出现对话框后~采用求和时的相同方法~完成操作?选中平均成绩行~点右键点设臵单元格~点数字~在分类项下点数值~设小数位为1~ b) 确定?保存2. (1)打开当前试题目录下文件excel-13.xls;,2,根据工作表中给定数据~按“合计=交通费+住宿费+补助”公式计算“合计”数~并计算交通费、住宿费和补助的合计数,,3,所有数字以单元格格式中货币类的“,”货币符号、小数点后2位数表现,如:,2,115.00格式,, ,4,同名存盘。
打开当前试题目录下文件excel-13.xls?在合计下的一个单元格内输入“=交通费,在该行的单元格~假如说是E3,+住宿费,同上,+补助,同上,”~回车,其他的合计可以采用填充柄完成~或者重复上面的顺序,?利用求和函数~参考1中的方法完成交通费、住宿费和补助的合计?选择文件中的所有数字单元格~点右键~点设臵单元格格式~点数字~点货币~选择货币符号为“,”~设臵小数点后为2位~确定?保存文件?本题完成3. (1)打开当前试题目录下文件excel-2.xls;,2,根据工作表中数据~计算“总成绩”列的数据。