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

词法分析

时间:2016-10-08 07:37:02      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

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

实验要求:

输入:源程序字符串

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

 

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

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

 

词法分析

标签:

原文地址:http://www.cnblogs.com/candyxue/p/5937267.html

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