/*词法分析源代码*/
#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;
}
}
#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;
}
}