天天看點

算法分析(借鑒版)

#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記錄存在非法字元