词法分析

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

实验要求:

输入:源程序字符串

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

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

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);
}
原文地址:https://www.cnblogs.com/candyxue/p/5937267.html