天天看點

44-小組詞法分析

#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==' ')

ch=input[p++];

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

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;

ch=input[p++];

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;

token[m++]=ch;

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

fg=21;

token[m++]=ch;

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

fg=22;

fg=20;

break;

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;

}

上一篇: C語言文法