首页 > 代码库 > 词法分析

词法分析

实验目的:编制一个词法分析程序

实验要求:

输入:源程序字符串

输出:二元组(种别,单词符号本身)

 

词法分析程序的主要任务:

1.对字符串表示的源程序 

2.从左到右进行扫描和分解

3.根据词法规则

4.识别出一个一个具有独立意义的单词符号

5.以供语法分析之用

 

各种单词符号对应的种别码:

单词符号

种别码

单词符号

种别码

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<math.h>char charp[80];                   //存放所有输入的字符char token[8];                   //单词自身字符串char ch;                        //单个字符char*rwtab[6]={"begin","if","then","while","do","end"};int sym;                      //sym:单词种别码int s=0,m=0,i=0,w=0,sum=0;   //sum:整型常数void analyze(){    for(i=0;i<8;i++)        token[i]=NULL;        ch=charp[s++];    while(ch== )    {        ch=charp[s];        s++;    }    if((ch>=0&&ch<=9))  //分析数字    {        while((ch>=0&&ch<=9))            {                sum=sum*10+ch-0;                ch=charp[s++];            }            s--;            sym=11;            if(sum>32767)                sym=-1;    }    else if((ch>=A&&ch<=Z)||(ch>=a&&ch<=z))   //分析标识符或者变量名    {        while((ch>=0&&ch<=9)||(ch>=A&&ch<=Z)||(ch>=a&&ch<=z))        {            token[m++]=ch;            ch=charp[s++];        }            token[m++]=\0;            s--;            sym=10;            for(i=0;i<6;i++)   //将识别出来的字符和已定义的标示符作比较,            if(strcmp(token,rwtab[i])==0)            {                sym=i+1;                break;            }    }    else switch(ch)//分析其他字符    {     case<:m=0;token[m++]=ch;        ch=charp[s++];        if(ch===)        {            sym=21;            token[m++]=ch;        }        else if(ch==>)        {            sym=22;            token[m++]=ch;        }        else        {            sym=23;            s--;        }        break;    case>:m=0;token[m++]=ch;       ch=charp[s++];       if(ch===)       {           sym=24;           token[m++]=ch;       }       else       {           sym=20;           s--;       }       break;    case::m=0;token[m++]=ch;       ch=charp[s++];       if(ch===)       {           sym=18;           token[m++]=ch;       }       else       {           sym=17;           s--;       }       break;        case*:            sym=13;token[0]=ch;            break;        case/:            sym=14;token[0]=ch;            break;        case+:            sym=15;token[0]=ch;            break;        case-:            sym=16;token[0]=ch;            break;        case=:            sym=25;token[0]=ch;            break;        case;:            sym=26;token[0]=ch;            break;        case(:              sym=27;token[0]=ch;              break;        case):            sym=28;token[0]=ch;            break;        case#:            sym=0;token[0]=ch;            break;        case\n:            sym=-2;            break;        default:            sym=-1;            break;    }}void main(){    printf("请输入一串字符串(以输入#号作为结束):");    do    {        ch=getchar();    //ch获取键盘输入的字符        charp[i++]=ch;   //把字符一个个放在charp数组中    }while(ch!=#);      //输入以#号键结束do{  analyze();   //识别单词  switch(sym)  {    case -1:        printf(" 错误 : w %d!\n",w);        break;    case -2:        w=w++;break;    case 11:        printf("(%d,%d)\n",sym,sum);        break;    default:        printf("(%d,%s)\n",sym,token);        break;  }}while(sym!=0);}

 

词法分析