天天看點

詞法分析

#include<stdio.h>

#include<string.h>

#include<ctype.h>

#define M 1000

struct

key

{

char

g[20];

};

typedef 

struct

key KEY;

int

main()

{

KEY k[6];

int

i=0,j=0;

char

a[M],b[M];

strcpy(k[0].g,

"begin"

);

strcpy(k[1].g,

"if"

);

strcpy(k[2].g,

"then"

);

strcpy(k[3].g,

"while"

);

strcpy(k[4].g,

"do"

);

strcpy(k[5].g,

"end"

);

printf(

"請輸入源程式:\n"

);

gets(a);

while

(a[i]!=

'\0'

)

{

j=0;

if

((isalpha(a[i]))||(a[i]==

'_'

))

{

while

((a[i]!=

' '

)&&(a[i]!=

'\0'

))

{

if

((isalpha(a[i]))||(isdigit(a[i])))

{

b[j]=a[i];

j++;

i++;

}

else

break

;

}

if

((a[i]==

' '

)||(a[i]==

'\0'

))

{

b[j]=

'\0'

;

if

(strcmp(b,k[0].g)==0)

printf(

"begin\t種别碼   1\n"

);

else

if

(strcmp(b,k[1].g)==0)

printf(

"if   \t種别碼   2\n"

);

else

if

(strcmp(b,k[2].g)==0)

printf(

"then \t種别碼   3\n"

);

else

if

(strcmp(b,k[3].g)==0)

printf(

"while\t種别碼   4\n"

);

else

if

(strcmp(b,k[4].g)==0)

printf(

"do   \t種别碼   5\n"

);

else

if

(strcmp(b,k[5].g)==0)

printf(

"end  \t種别碼   6\n"

);

else

printf(

"%s  \t種别碼   10\n"

,b);

}

else

{

b[j]=

'\0'

;

printf(

"%s   \t種别碼       10\n"

,b);

i--;

}

}

else

if

(isdigit(a[i]))

{

j=0;

while

(isdigit(a[i]))

{

b[j]=a[i];

j++;

i++;

}

b[j]=

'\0'

;

printf(

"%s    \t種别碼    11\n"

,b);

i--;

}

else

{

switch

(a[i])

{

case

'+'

:

printf(

"%c   \t種别碼   13\n"

,a[i]);

break

;

case

'-'

:

printf(

"%c   \t種别碼   14\n"

,a[i]);

break

;

case

'*'

:

printf(

"%c   \t種别碼   15\n"

,a[i]);

break

;

case

'/'

:

printf(

"%c   \t種别碼   16\n"

,a[i]);

break

;

case

':'

:

if

(a[i+1]==

'='

)

{   printf(

":=   \t種别碼   18\n"

);i++;

break

;}

else

{   printf(

"%c   \t種别碼   17\n"

,a[i]);

break

;}

case

'<'

:

if

(a[i+1]==

'='

)

{   printf(

"<=   \t種别碼   21\n"

);i++;

break

;}

if

(a[i+1]==

'>'

)

{   printf(

"<>   \t種别碼   22\n"

);i++;

break

;}

else

printf(

"%c   \t種别碼   20\n"

,a[i]);

break

;

case

'>'

:

if

(a[i+1]==

'='

)

{   printf(

">=   \t種别碼   24\n"

);i++;

break

;}

else

printf(

"%c   \t種别碼   23\n"

,a[i]);

break

;

case

'='

:

printf(

"=    \t種别碼    25\n"

);

break

;

case

';'

:

printf(

";   \t種别碼    26\n"

);

break

;

case

'('

:

printf(

"(   \t種别碼   27\n"

);

break

;

case

')'

:

printf(

")   \t種别碼   28\n"

);

break

;

case

'#'

:

printf(

"#   \t種别碼   0\n"

);

break

;

default

:

printf(

"%c   \t文法錯誤!\n"

,a[i]);

break

;

}

}

i++;

}

}