词法分析

实验一、词法分析实验

专业:商业软件   姓名:韦兴纳  学号:201506110242

一、        实验目的

 

编写一个词法分析程序模拟编译器分析解释程序字符串的过程。

 

二、        实验内容和要求

输入:源程序字符串

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

 

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

 

单词符号

种别码

单词符号

种别码

Begin

1

:

17

If

2

:=

18

Then

3

20

While

4

<=

21

Do

5

<> 

22

End

6

23

|(||d)*

10

>=

24

Dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

 

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

 

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

可执行程序名:词法分析.exe

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

 

 

 

  1. 3.      主要程序段及其解释:

1、接收用户输入:getchar()和do…while循环的组合

    do{

           ch=getchar();

           prog[p++]=ch;

    }while(ch!='#');  //输入以#号键结束

2、对输入的字符串进行数字字符和字母字符的分析判断,并保存相应单词的种别码

void scaner(){

     int m=0;

     sum=0;

     char *keyword[7]={"begin","if","then","for","while","do","end"};//数组存放关键字

    for(n=0;n<9;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<7;n++)

            if(strcmp(token,keyword[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=29;token[0]=ch;

                          break;

             case'#':

syn=0;token[0]=ch;

                          break;

             default:syn=-1;}

}

 

 

  1. 4.      运行结果及分析

 

 

 

 

 

 

 

四、        实验总结

 

心得体会,实验过程的难点问题及其解决

    做词法分析程序时遇到了很多困难,因为其中涉及很多分析判断。编程之前必须对题目有清晰的思路。先用getchar()和do…while循环的组合接受用户输入的字符串,再用isalpha(ch)||isdigit(ch)对读取的字符串进行字母字符和数字字符的判断。接着逐个读取字符进行词法分析。

 

 

posted on 2016-10-20 10:29  242韦兴纳  阅读(198)  评论(2编辑  收藏  举报

导航