码迷,mamicode.com
首页 > 其他好文 > 详细

2016.9.30词法分析程序

时间:2016-09-30 23:30:16      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

单词符号

种别码

单词符号

种别码

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词法分析程序

标签:

原文地址:http://www.cnblogs.com/yxbdbolgs/p/5924947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!