词法分析程序生成实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无符号数的词法分析程序
一、实验课程的性质、目的和任务
1.培养学生初步掌握编译原理实验的技能。
2.验证所学理论、巩固所学知识并加深理解。
3.对学生进行实验研究的基本训练。
二、实验内容
掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。
三、实验要求
从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。
四、无符号数语法规则
<无符号数>→<无符号实数>│<无符号整数>
<无符号实数>→<无符号整数>.<数字串>[E<比例因子>]│
<无符号整数>E<比例因子>
<比例因子>→<有符号整数>
<有符号整数>→[+│-]<无符号整数>
<无符号整数>→<数字串>
<数字串>→<数字>{<数字>}
<数字>→0 1 2 3 (9)
五、实验流程图
六、实验源代码
#include<stdio.h>
#include<stdlib.h>
#include <errno.h>
#include<ctype.h>
#include<math.h>
#define N 50
char UnsignedNumber[N] ;/*用来储存提取出来的无符号数字符串*/ /*识别已经提取出来的无符号数字符串*/
void ReadUnsignedNumber(){
int w=0 ;
int p=0 ;
int j=0 ;
int i=0 ;
short e=1 ;
short d=0 ;
double DataValue ;
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*pow(10,e*p-j) ;
printf("The value of %s is %f\n",UnsignedNumber,DataV alue) ;
}
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*pow(10,e*p-j) ;
printf("The value of %s is %f\n",UnsignedNumber,DataV alue) ;
}
}
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*pow(10,e*p-j) ;
printf("The value of %s is %f\n",UnsignedNumber,DataV alue) ; }
else{
DataValue=w ;
printf("The value of %s is %f\n",UnsignedNumber,DataV alue) ;
}
if (errno == ERANGE){
printf("Overflow condition occurred!\n");
}
}
int main(){
char ch ;
int i ;
int flag=0 ;
printf("Please input the data with ';' to end!\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("The data you input is wrong!\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("The data you input is wrong!\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("The data you input is wrong!\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("The data you input is wrong!\n") ;
exit(1) ;
}
else{
UnsignedNumber[i]='\0' ;
}
}
}
else{
UnsignedNumber[i]='\0' ;
}
if(i!=0){
ReadUnsignedNumber() ;
flag=1 ;
}
if(flag==0){
printf("Sorry!There is no unsigned number in your data!\n") ;
}
}
return 0 ;
}
七、实验结果。