首页 > 代码库 > 2016.9.30词法分析程序

2016.9.30词法分析程序

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

#include<stdio.h>#include<string.h>#include<stdlib.h> char TOken[10];//分开进行比较 char ch;char r1[]={"begin"};char r2[]={"if"};char r3[]={"then"};char r4[]={"while"};char r5[]={"do"};char r6[]={"end"};char A[10000];//输入的所有值 int syn,row;int n,m,p,sum,j;static int i = 0;void scaner();main(){     row = 0 ;    p = 0 ;    printf("请输入字符串:(#为结束)\n");    do    {        scanf("%c",&ch);        A[p]=ch;        p++;    }//输入值到数组A【】中,以#结束     while(ch!=#);    do    {        scaner();//进入函数进行判定         switch(syn)        {        case 11: printf("(%d,%d)\n",syn,sum); break;//如果是11,那么就是数字         case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是# 结束         case -2: row=row++;break;        case -1:break;        default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词         }    }    while (syn!=0);}void scaner(){    for(n=0;n<7;n++)         TOken[n]=0;//每次循环完就清零     ch=A[i];    while(ch== ||ch==\n)//如果字符是空格或者回车,跳过     {        i++;        ch=A[i];    }    if((ch>=a&&ch<=z)||(ch>=A&&ch<=Z)) //可能是标示符或者变量名     {        m=0;        while((ch>=0&&ch<=9)||(ch>=a&&ch<=z)||(ch>=A&&ch<=Z))//找到一个变量名或者关键字,直到遇到空格为止         {            TOken[m]=ch;m++;            i++;ch=A[i];        }        TOken[m]=\0;//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......         if(strcmp(TOken,r1)==0){syn=1;}        else if(strcmp(TOken,r2)==0){syn=2;}        else if(strcmp(TOken,r3)==0){syn=3;}         else if(strcmp(TOken,r4)==0){syn=4;}        else if(strcmp(TOken,r5)==0){syn=5;}        else if(strcmp(TOken,r6)==0){syn=6;}        else{syn=10;}    //变量名     }    else if((ch>=0&&ch<=9)) //数字     {        sum=0;        while((ch>=0&&ch<=9))        {            sum=sum*10+ch-0;//显示其数字sum             i++;            ch=A[i];        }        syn=11;    }    else switch(ch) //其他字符     {case<:    m=0;    TOken[m]=ch;    m++;    i++;    ch=A[i];    if(ch===)    {        syn=21;        TOken[m]=ch;        m++;        i++;    }    else if(ch==>)     {        syn=22;        TOken[m]=ch;        m++;        i++;    }    else    {        syn=20;    }break;case>:    m=0;    TOken[m]=ch;    m++;    i++;    ch=A[i];    if(ch===)    {        syn=24;        TOken[m]=ch;        m++;        i++;    }    else    {        syn=23;    }break;case::    m=0;    TOken[m]=ch;    m++;    i++;    ch=A[i];    if(ch===)    {        syn=18;        TOken[m]=ch;        m++;        i++;    }    else    {        syn=17;    }break; case+:syn=13;TOken[0]=ch;i++;break; case-:syn=14;TOken[0]=ch;i++;break;case*:syn=15;TOken[0]=ch;i++;break;case/:syn=16;TOken[0]=ch;i++;break; case=:syn=25;TOken[0]=ch;i++;break;case;:syn=26;TOken[0]=ch;i++;break;case(:syn=27;TOken[0]=ch;i++;break;case):syn=28;TOken[0]=ch;i++;break; case#:syn=0;TOken[0]=ch;i++;break; case\n:syn=-2;break;default:syn=-1;    }}

 技术分享

 

2016.9.30词法分析程序