#include<stdio.h>
#include<string.h>//strcmp()用于比較兩個字元串
#include<conio.h>//getch()
#define max 200
char pro[max], lin[20];
int n,i,syn;
char *word[6]={ "begin", "if" , "then", "while", "do" ,"end" }; // 關鍵字,特殊辨別符
char ch ;
scaner( )
{
int j=0;
for ( n=0; n<20; n++ )
lin[n]=NULL; //臨時數組初始化
ch=pro[i++]; //讀取字元串
while (ch==' ') //判斷,跳過空字元
ch=pro[i++]; //讀取整個單詞
if ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57)) //判斷是否是字母或數字
{
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) //判斷标示符和特殊關鍵字
{
lin[j++]=ch;
ch=pro[i++]; //pro[i++]空,關鍵字
while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))//判斷辨別符
{
lin[j++]=ch;
ch=pro[i++];
}
lin[j]='\0'; //結束标志,回車
i--;
syn=10; //單詞種别碼
for (n=0;n<6 ;n++ )
if(strcmp(lin,word[n])==0) //查找關鍵字表是否符合
{
syn=n+1;
break ;
}
}
else //判斷數字
{
while (ch>=48&&ch<=57)
ch=pro[i++];
lin[j]='\0';
syn=11;
}
else //判斷其它符号
{
//判斷<,<=,<>
if(ch=='<')
ch=pro[i++];
if (ch=='>')
{
syn=21;
lin[j]='\0';
else if(ch=='=')
syn=22;
else
syn=20;
i--;
}
///判斷>,>=
else if(ch=='>')
if (ch=='=')
{
syn=24;
syn=23;
//判斷 :,:=
else if(ch==':')
syn=18;
syn=17;
}
///判斷其它符号
else if(ch=='+')
syn=13;
lin[j]='\0';
else if(ch=='-')
syn=14;
else if(ch=='*')
syn=15;
else if(ch=='/')
syn=16;
else if(ch=='=')
syn=25;
else if(ch==';')
syn=26;
else if(ch=='(')
syn=27;
else if(ch==')')
syn=28;
else if(ch=='#')
syn=0;
else
syn=-1;
}
return syn;
void read() //定義從檔案讀入資料函數
{
int k;
for(k=0;k<max-1;k++)
scanf("%c",&pro[k]);
pro[k]='\0';
void main()
{
int i=0 ;
printf( "Please input source code:\n" );
do{
ch=getchar();//讀入字元串
pro[i++]=ch;
}while(ch!='#');//将所讀字元串存入數組pro[],直到遇到#
i=0;
do
{
scaner();
switch(syn)
{
case 11: printf ("(%d,%s)\n",syn,lin);
break;
case -1: printf("錯誤符号\n");
break;
default: printf ("(%d,%s)\n",syn,lin);
}
} while (syn!=0);
getch();