#include<stdio.h>
#include<string.h>
void Fenxi(char c,char b);
void word(char a[]);
void number(char a[]);
int i; //定義全局變量i
int s=1; //用來記錄是否存在非法字元
main(){
int j=0;
char a[50];
printf("請輸入源程式:");
do
{
scanf("%c",&a[j]);
j++;
}while(a[j-1]!='#');
printf("您要分析的源程式為:");
for(j=0;a[j]!='#';j++)
printf("%c",a[j]);
}
printf("\n");
for(i=0;(a[i-1]!='#')&&(i<50)&&s==1;i++)
{
if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
word(a);
else if(a[i]>='0' && a[i]<='9')
number(a);
else
Fenxi(a[i],a[i+1]);
}
}
void number(char a[]) //對數字字元進行掃描分析
{
char b[50];
int m,k=0,t;
m=i;
while(a[m]>='0' && a[m]<='9')
b[k]=a[m]; //用數組b存放數組a中的數字
k++;
b[k]='\0';
m++;
i=m-1;
printf("(11,%s)",b);
void word(char a[]) //對字母字元進行掃描分析,并識别保留字
int k=0,m,flag=0,t;
char *key[6]={"begin","if","then","while","do","end"};
while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z') || (a[m]>='0' && a[m]<='9')) //用數組b存放數組a中的字母
b[k]=a[m];
m++;
for(t=0;t<6;t++)
if(strcmp(b,key[t])==0) //将數組b與關鍵字進行比較
{
printf("(%d,%s)",t+1,key[t]); //輸出關鍵字
flag=1;
}
if(flag==0)
printf("(10,%s)",b); //輸出辨別符
void Fenxi(char c,char b) //對特殊字元進行掃描分析
switch(c){
case ' ':
break;
case '+':
printf("(13,+)");
case '-':
printf("(14,-)");
case '*':
printf("(15,*)");
case '/':
printf("(16,/)");
case ':':
if(b=='=')
{
i++;
printf("(18,:=)");
}
else
printf("(17,:)");
case '<':
if(b=='>')
printf("(21,<>)");
else if(b=='=')
printf("(22,<=)");
printf("(20,<)");
case '>':
printf("(24,>=)");
printf("(23,>)");
case '=':
printf("(25,=)");
case ';':
printf("(26,;)");
case '(':
printf("(27,()");
case ')':
printf("(28,))");
case '#':
printf("(20,#)");
default:
printf("\n存在字元 '%c',無法繼續識别!\n",c);
s=0; //用s=0記錄存在非法字元