编译原理实验.docx
《编译原理实验.docx》由会员分享,可在线阅读,更多相关《编译原理实验.docx(13页珍藏版)》请在冰豆网上搜索。
编译原理实验
《编译原理D》
实验指导书
专业计算机科学
班级计科1303
姓名徐秀峰
学号2013002038
指导老师冯秀芳
太原理工大学计算机科学与技术学院
2015年10月
《编译原理》实验
适用专业:
计算机实验类别:
专业实验
实验时数:
8学时
一、实验课程的性质、目的和任务
1.培养学生初步掌握编译原理实验的技能。
2.验证所学理论、巩固所学知识并加深理解。
3.对学生进行实验研究的基本训练。
二、实验课程的内容、要求及学时分配
实验一、无符号数的词法分析程序(4学时)
内容:
掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。
要求:
从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。
无符号数文法规则可定义如下:
<无符号数>→<无符号实数>│<无符号整数>
<无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│
<无符号整数>E<比例因子>
<比例因子>→<有符号整数>
<有符号整数>→[+│-]<无符号整数>
<无符号整数>→<数字串>
<数字串>→<数字>{<数字>}
<数字>→0123......9
读无符号数的程序流程图见下图
实验源代码
#include
#include"stdafx.h"
#include
#include
#include
#include
#defineN100
charUnsignedNumber[N];
voidReadUnsignedNumber()
{
intw=0;
intp=0;
intj=0;
inti=0;
shorte=1;
shortd=0;
doubleDataValue;
while(isdigit(UnsignedNumber[i]))
{
d=UnsignedNumber[i]-48;
w=w*10+d;
i++;
}
if(UnsignedNumber[i]=='.')
{
i++;
while(isdigit(UnsignedNumber[i]))
{
d=UnsignedNumber[i]-48;
w=w*10+d;
j++;
i++;
}
if(UnsignedNumber[i]=='\0')
{
DataValue=w*powf(10,e*p-j);
printf("无符号数值是%f\n",DataValue);
}
else
if(UnsignedNumber[i]=='e'||UnsignedNumber[i]=='E')
{
i++;
if(UnsignedNumber[i]=='-')
{
e=-1;
i++;
}
else
if(UnsignedNumber[i]=='+')
{
i++;
}
do{
d=UnsignedNumber[i]-48;
p=p*10+d;
i++;
}while(isdigit(UnsignedNumber[i]));
DataValue=w*powf(10,e*p-j);
printf("无符号数值是%f\n",DataValue);
}
}
else
if(UnsignedNumber[i]=='e'||UnsignedNumber[i]=='E')
{
i++;
if(UnsignedNumber[i]=='-')
{
e=-1;
i++;
}
else
if(UnsignedNumber[i]=='+')
{
i++;
}
do{
d=UnsignedNumber[i]-48;
p=p*10+d;
i++;
}while(isdigit(UnsignedNumber[i]));
DataValue=w*powf(10,e*p-j);
printf("无符号数值是%f\n",DataValue);
}
else
{
DataValue=w;
printf("无符号数值是%f\n",DataValue);
}
if(errno==ERANGE)
{
printf("取值范围溢出!
!
!
\n");
}
}
intmain()
{
charch;
inti;
intflag=0;
printf("请输入一个符号串\n");
ch=getchar();/*扫描输入的字符串,从中提取无符号数字符串*/
while(ch!
=';')
{
i=0;
while(!
isdigit(ch))
{
if(ch==';')
{
break;
}
ch=getchar();
}
while(isdigit(ch))
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}
if(ch=='.')
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
while(isdigit(ch))
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}
if(ch=='e'||ch=='E')
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
if(!
isdigit(ch))
{
if(ch=='+'||ch=='-')
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
if(!
isdigit(ch))
{
i--;
UnsignedNumber[i]='\0';
}
else
{
do
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}while(isdigit(ch));
if(ch=='.')
{
printf("输入错误!
\n");
exit
(1);
}
else
{
UnsignedNumber[i]='\0';
}
}
}
else
{
i--;
UnsignedNumber[i]='\0';
}
}
else
{
do
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}while(isdigit(ch));
if(ch=='.')
{
printf("输入错误!
\n");
exit
(1);
}
else
{
UnsignedNumber[i]='\0';
}
}
}
else
{
UnsignedNumber[i]='\0';
}
}
else
if(ch=='e'||ch=='E')
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
if(!
isdigit(ch))
{
if(ch=='+'||ch=='-')
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
if(!
isdigit(ch))
{
i--;
UnsignedNumber[i]='\0';
}
else
{
do
{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}while(isdigit(ch));
if(ch=='.')
{
printf("输入错误!
\n");
exit
(1);
}
else
{
UnsignedNumber[i]='\0';
}
}
}
else{
UnsignedNumber[i]='\0';
}
}
else{
do{
UnsignedNumber[i]=ch;
i++;
ch=getchar();
}while(isdigit(ch));
if(ch=='.')
{
printf("输入错误!
\n");
exit
(1);
}
else{
UnsignedNumber[i]='\0';
}
}
}
else{
UnsignedNumber[i]='\0';
}
if(i!
=0)
{
ReadUnsignedNumber();
flag=1;
}
if(flag==0)
{
printf("没有无符号数!
\n");
}
}
return0;
}
实验截图
·
·