天天看點

詞法分析

#include<stdio.h>

#include<string.h>

int i,j,k,sign,flag,number,run;

char ch;

char word[10];

char program[500];

int Scan(char program[])

{

char *keyword[8]={"iii""begin","if","then","while","do","end"};

number=0;

flag=0;

j=0;

ch=program[i++];

while(ch=='\n'||ch==' '||ch=='\t'||ch=='\r')

}

if(ch>='a'&&ch<='z')

while(ch>='a'&&ch<='z')

word[j++]=ch;

i--;

word[j++]='\0';

for(k=0;k<8;k++)

if(strcmp(word,keyword[k])==0)

flag=1;

sign=k+1;

else

sign=300;

} //是關鍵字,不是辨別符//

break;

if(ch>'0'&&ch<'9') //是不是數字//

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

number=number*10+(ch-'0');

sign=200;

else 

switch(ch)

case '=':{

if(ch=='=')

word[j]='\0';

sign=25; //=//

case '<':{

if(ch=='<')

word[j]='\0'; 

sign=21;

sign=20;

case '>':{

if(ch=='>')

sign=24;

sign=23;

case '(':{

if(ch=='(')

sign=27;

case ')':{

if(ch==')')

sign=28;

case ':':{

if(ch==':')

sign=18;

sign=17;

case '#':{

if(ch=='#')

sign=0;

case ';':{

if(ch==';')

sign=26;

case '+':{

if(ch=='+')

sign=13;

case '-':{

if(ch=='-')

sign=14;

case '*':{

if(ch=='*')

sign=15;

case '/':{

if(ch=='/')

sign=16;

case '@':{

if(ch=='@')

return sign;

int main()

int i=0,run=1,sign=0,sum=1,ent;

while(run)

int j;

for(j=0;j<500;j++)

program[j]=' ';

for(j=0;j<10;j++)

word[j]=' ';

printf("請輸入一段源代碼");

do{

ch =getchar();

program[i++]=ch;

}while(ch!='@');

i=0;

sign=Scan(program);

if(sign==13)

printf("操作符 %8s %5d",word,sign);

sum++;

ent=1;

if(sign==14)

if(sign==15)

if(sign==16)

if(sign==17)

if(sign==18)

if(sign==20)

if(sign==21)

if(sign==22)

if(sign==24)

if(sign==25)

if(sign==26)

if(sign==27)

if(sign==28)

if(sign>=1&&sign<=8)

printf("關鍵字 %8s %5d",word,sign);

} while(sign!=0);

printf("是否繼續?y or N");

getchar();

ch=getchar();

if(ch=='n'||ch=='N')

run=0;

return 0;