天天看點

25-陳慶祥-詞法分析

#include<stdio.h> 

#include<string.h> 

char input[200];//存放輸入字元串 

char token[5];//存放構成單詞符号的字元串 

char ch; //存放目前讀入字元 

int p; //input[]下标 

int fg; //switch标記 

int num; //存放整形值

//二維字元數組,存放關鍵字 

char index[6][6]={"begin","if","then","while","do","end"}; 

main() 

p=0; 

printf("please intput string(End with '#'):\n"); 

do 

ch=getchar(); 

input[p++]=ch; 

}while(ch!='#'); 

scaner(); 

switch(fg) 

case 11:printf(" %d,%d \n",fg,num);break; 

case -1:printf("input error\n"); break; 

default:printf(" %d,%s \n",fg,token); 

}while(fg!=0); 

getch(); //用于讓程式停留在顯示頁面 

/*詞法掃描程式:*/ 

int scaner() 

int m=0;//token[]下标 

int n; 

//清空token[] 

for(n=0;n<5;n++) 

token[n]=NULL; 

//擷取第一個不為0字元 

ch=input[p++]; 

while(ch==' ')

//關鍵字(辨別符)處理流程 

if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')) 

while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0')) //(此處ch<=……是否可略去?)

token[m++]=ch; 

token[m++]='\0'; 

ch=input[--p]; 

fg=10; 

for(n=0;n<6;n++) 

if(strcmp(token,index[n])==0)//strcmp()函數可比較兩個字元串,相等時傳回0 

fg=n+1; 

break; 

//數字處理流程 (這裡不懂)

else if((ch<='9'&&ch>='0')) 

num=0; 

while((ch<='9'&&ch>='0')) 

num=num*10+ch-'0'; 

fg=11; 

//運算符界符處理流程 

else 

switch(ch) 

case '<': 

m=0; 

if(ch=='>') //産生<> 

fg=21; 

else if(ch=='=') //産生<= 

fg=22; 

fg=20; 

case '>': 

if(ch=='=') //産生>= 

fg=24; 

else //産生> 

fg=23; 

case ':': 

if(ch=='=') //産生:= 

fg=18; 

else //産生: 

fg=17; 

case '+':fg=13;token[0]=ch;break; 

case '-':fg=14;token[0]=ch;break; 

case '*':fg=15;token[0]=ch;break; 

case '/':fg=16;token[0]=ch;break; 

case ':=':fg=18;token[0]=ch;break; 

case '<>':fg=21;token[0]=ch;break; 

case '<=':fg=22;token[0]=ch;break; 

case '>=':fg=24;token[0]=ch;break; 

case '=':fg=25;token[0]=ch;break; 

case ';':fg=26;token[0]=ch;break; 

case '(':fg=27;token[0]=ch;break; 

case ')':fg=28;token[0]=ch;break; 

case '#':fg=0;token[0]=ch;break; 

default:fg=-1; 

}