实验一

    实验一、词法分析实验

商业软件工程    陈楚洪   201506110137 

一、        实验目的

     设计、编制、调试一个词法分析程序,用来识别单词,加深对词法分析原理的理解。

二、        实验内容和要求

     该程序要实现的是一个单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。并依次输出各个单词的内部编码及单词符号自身值。

保留字:begin、end、if、while、var等。

标识符:表示各种名字,如常量名、变量名等。

常数:3、25、3.1515、TURE等。

运算符:+、—、*、/、#、<、<=、>、>=、:=

分界符:逗号,、分号、括号等。

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

单词符号

种别码

单词符号

种别码

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

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

三、        实验方法、步骤及结测试6666666

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名×××.c

可执行程序名:×××.exe

  1. 2.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

 
   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.源代码:

#include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/

#include<string.h>               /*定义字符串库函数*/

#include<conio.h>                  /*提供有关屏幕窗口操作函数*/

#include<ctype.h>                  /*分类函数*/

char prog[80]={'\0'},

     token[8];                     /*存放构成单词符号的字符串*/

char ch;

int syn,                           /*存放单词字符的种别码*/

      n,

    sum,                           /*存放整数型单词*/

    m,p;                           /*p是缓冲区prog的指针,m是token的指针*/

char *rwtab[6]={"begin","if","then","while","do","end"};

void scaner(){

    m=0;

    sum=0;

    for(n=0;n<8;n++)

        token[n]='\0';

    ch=prog[p++];

    while(ch==' ')

        ch=prog[p++];

    if(isalpha(ch))    /*ch为字母字符*/

    {

        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/

           {

           token[m++]=ch;

           ch=prog[p++];}

        token[m++]='\0';

        ch=prog[p--];

        syn=10;

        for(n=0;n<6;n++)

            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/

                  {

                syn=n+1;

                break;}}

    else

        if(isdigit(ch))    /*ch是数字字符*/

           {

            while(isdigit(ch))    /*ch是数字字符*/

                  {

                sum=sum*10+ch-'0';

                ch=prog[p++];}

            ch=prog[p--];

            syn=11;}

        else

            switch(ch)

           {

                case'<':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='>'){

                            syn=21;

                            token[m++]=ch;}

                        else if(ch=='='){

                            syn=22;

                            token[m++]=ch;}

                            else{

                                 syn=20;

                                 ch=prog[p--];}

                        break;

                case'>':m=0;token[m++]=ch;ch=prog[p++];

                        if(ch=='='){

                            syn=24;

                            token[m++]=ch;}

                        else{

                            syn=23;

                            ch=prog[p--];}

                        break;

             case':':m=0;token[m++]=ch;ch=prog[p++];

                     if(ch=='='){

                         syn=18;

                         token[m++]=ch;}

                     else{

                         syn=17;

                         ch=prog[p--];}

                     break;

             case'+':syn=13;token[0]=ch;break;

             case'-':syn=14;token[0]=ch;break;

             case'*':syn=15;token[0]=ch;break;

             case'/':syn=16;token[0]=ch;break;

             case'=':syn=25;token[0]=ch;break;

             case';':syn=26;token[0]=ch;break;

             case'(':syn=27;token[0]=ch;break;

             case')':syn=28;token[0]=ch;break;

             case'#':syn=0;token[0]=ch;break;

             default:syn=-1;}}

main()

{

 

p=0;

    printf("please input string:\n");

    do {

           ch=getchar();

           prog[p++]=ch;

       }while(ch!='#');

    

p=0;

    do{

        scaner();

        switch(syn){

            case 11: printf("(%d,%d)\n",syn,sum);break;

          //  case -1: printf("\n ERROR;\n");break;

            default: printf("(%d,%s)\n",syn,token);

}

}while(syn!=0);

    //getch();

}

 

 

4.实验结果

 

 

四、        实验总结

通过存储输入的字符串,用循环的方式逐个提取出来与种别码比较,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符五大类。

 

 

 

 

 

 

 

 

 

 

posted on 2016-10-13 22:28  137陈楚洪  阅读(145)  评论(1编辑  收藏  举报

导航