#include?"stdio.h"?/*定義I/O庫所用的某些宏和變量*/
#include?"string.h"?/*定義字符串庫函數*/
#include?"conio.h"?/*提供有關屏幕窗口操作函數*/
#include?"ctype.h"?/*分類函數*/
char?prog[80]={'\0'},
token[8];?/*存放構成單詞符號的字符串*/char?ch;
int?syn,/*存放單詞字符的種別碼*/
n,sum,/*存放整數型單詞*/
m,p;/*p是緩沖區prog的指針,m是token的指針*/
char?*rwtab[6]={"begin","if","then","while","do","end"};
void?scaner(){
m=0;
sum=0;
for(n=0;n<8;n++)
token[n]='\0';
ch=prog[p++];
while(ch=='?')
ch=prog[p++];
if(isalpha(ch))/*ch為字母字符*/{
while(isalpha(ch)||isdigit(ch))/*ch?為字母字符或者數字字符*/{
token[m++]=ch;
ch=prog[p++];}
token[m++]='\0';
ch=prog[p--];
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)/*字符串的比較*/{
syn=n+1;
break;}}
else
if(isdigit(ch))/*ch是數字字符*/{
while(isdigit(ch))/*ch是數字字符*/{
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=21;
token[m++]=ch;}
else?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=18; token[m++]=ch;} else{ syn=17; ch=prog[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; default:syn=-1;}}main()
{
printf("\n\nThe?significance?of?the?figures:\n"
"1.figures?1?to?6?said?Keyword\n"
"2.figures?10?and?11?said?Other?indicators\n"
"3.figures?13?to?28?said?Operators\n");
p=0;
printf("\nplease?input?string:\n");
do?{
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{
scaner();
switch(syn){
case?11:?printf("(%d,%d)\n",syn,sum);break;
case?-1:?printf("\n?ERROR;\n");break;
default:?printf("(%d,%s)\n",syn,token);
}
}while(syn!=0);getch();
}
程序測試結果
對源程序begin?x:=9:?if?x>9?then?x:=2*x+1/3;?end?#的源文件,經過詞法分析後輸出如下圖5-1所示:
具體的妳在修改修改吧