单词符号

种别码

单词符号

种别码

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;
    }
}

 

 

posted on 2016-09-30 21:23  108-杨晓彬  阅读(119)  评论(0编辑  收藏  举报