编译原理词法分析(文本输入)源程序

/*词法分析源代码*/ 
#include<stdio.h> 
#include<string.h> 
scaner();  
char prog[80],token[9]; 
char ch;  
int syn,p,m,n,sum;  
char * rwtab[6]={"function","if","then","while","do","endfunc"};  
int i=0,k,c,sumint,f; 
char xiaoshu[80],sum1[80]; 
double sumf=0,fudian; 
main() 
{
FILE *fp;
     p=0;  
    //if((fp=fopen("D:\\hy.txt","r"))==NULL)
// if((fp=fopen("E:\\编译原理期末代码\\161.txt","r"))==NULL)
if((fp=fopen("E:\\编译原理期末代码\\162.txt","r"))==NULL)
{
        printf("\n 文件打开失败:\n");
return 0;
}
    do{ 
        
   ch=fgetc(fp);
        prog[++p]=ch;//prog[1]=ch
} while(ch!='#'); //将文件中所有内容赋值给prog数组
    p=0; 
    do{ 
        scaner();  
        switch(syn){
       case 11:printf("\n(%d,%d)",syn,sum);break; //整数 
                case -1:printf("\n error");break;  
                case 80:printf("\n(%d,%f)",syn,fudian);break; //浮点数
default:printf("\n(%d,%s)",syn,token); //字符串
}  
}while(syn!=0);

scaner() 
{  
for(n=0;n<8;n++)   
token[n]=NULL; 
ch=prog[++p];//ch为数据单位第一个输入内容 
    while(ch==' ' || ch=='\n')  
ch=prog[++p];
if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))//字符串
{  
m=0;  
while((ch>='a' && ch<='z') || (ch>='0' && ch<='9') || (ch>='A' && ch<='Z')) 
{   
token[m++]=ch;
ch=prog[++p];  
}  
token[m]='\0'; //将字符串存放在token数组中
ch=prog[--p]; //ch为该数组中最后一个字符
syn=10;  
for(n=0;n<6;n++)//是否为关键字

if(strcmp(token,rwtab[n])==0) 

syn=n+1;break; 
}  

}  
    else if(ch>='0' && ch<='9')//数字 eg:31.45; 
{  
c=p; 
k=0;  
do{ 
sum1[k]=ch;  //将该字母赋值给sum1数组 sum1[0]=3,sum1[1]=1(sum1中存放该数整数部分字)
ch=prog[++c]; //读取下一个 ch=.
k++;  //k=2,说明小数点前面有几位数

if(ch>='0' && ch<='9') { syn=80; }
else syn=-2; 
f=syn; 
} while(f==80); 
if(ch=='.') 
{   
sumint=0; 
for(n=0;n<k;n++) 
{  
sumint=sumint*10+sum1[n]-'0'; //n=0,sumint=3,n=1,sumint=3*10+1=31(计算整数部分)
}       
i=0; 
do{  
ch=prog[++c]; //取小数点后一位数
xiaoshu[i]=ch; //将ch赋值给fenshu数组(该数组存放该数的小数部分)
i++;  //记录小数位数 eg:i=1,i=2
       if(ch>='0' && ch<='9') 
                        syn=80; 
                    else 
                        syn=-2; 
} while(syn==80);  
sumf=0;  
for(k=i-2;k>=0;k--)//计算小数部分
{  
sumf=sumf*0.1+(xiaoshu[k]-'0')*0.1;
}             
fudian=sumint+sumf;       
syn=80; 
p=--c; 

else{  
ch=prog[p];//若是整数,ch等于原来的值
sum=0;  
while(ch>='0' && ch<='9') 
{  
sum=sum*10+ch-'0'; 
ch=prog[++p]; 
}  
ch=prog[--p];syn=11; 
}
}
 
else 
switch(ch)  

           case'<':m=0; 
  token[m++]=ch; 
  ch=prog[++p]; 
  if(ch=='=')
  {
  syn=22; 
  token[m++]=ch; 
  }
  else 
 
  {
  syn=20;
  ch=prog[--p];
  }
  break;  
  case'>':m=0; 
  token[m++]=ch; 
  ch=prog[++p]; 
  if(ch=='=') 
  {
  syn=24;  
  token[m++]=ch; 
  }
  else 
  {
  syn=23; 
  ch=prog[--p];
  } 
  break;  
  case'=':m=0; 
  token[m++]=ch; 
  ch=prog[++p]; 
  if(ch=='=')  
  {
  syn=25; 
  token[m++]=ch; 
  }
  else 
  {
  syn=18; 
  ch=prog[--p];
  } 
  break;  
  case'!':m=0;token[m++]=ch; 
  ch=prog[++p]; 
  if(ch=='=') 
  {
  syn=22;
  token[m++]=ch; 
  } 
  else 
  { 
  syn=-1; 
  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=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; 
  default:syn=-1;  
}  
 }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值