词法分析实验报告

痴心易碎 提交于 2020-01-05 01:40:56

实验一、词法分析实验

专业:商业软件工程   姓名:吴梅英  学号:201506110188

一、 实验目的

编制一个词法分析程序,加深对编译原理的理解,掌握编译程序的实现方法。 

二、 实验内容和要求

(1) 输入:源程序字符串。

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

(3) 待分析语言的词法规则。

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

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

可执行程序名:

×××.exe

2.原理分析及流程图

                       

待分析的简单词法

(1) 关键字:begin  if  then  while  do  end  所有的关键字都是小写。

(2) 运算符和界符::= + - * / < <= > >= ; ( ) #

(3) 空格有空白、制表符和换行符组成。

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

单词符号

种别码

单词符号

种别码

begin

1

17

if

2

: =

18

then

3

20

while

4

<> 

21

do

5

<=

22

end

6

23

letter (letter | digit)*

10

>=

24

digit digit*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

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

主要功能:输入:所给文法的源程序字符串。

          输出:二元组(syn,tokensum)构成的序列。

          其中:syn为单词种别码;

                token为存放的单词自身字符串;

                sum为整型常数

主要程序:

main()  

{  

    p=0;  

    printf("\n 请输入字符串('#'结束):\n");  

      

    do{  

            scanf("%c",&ch);  //输入字符串

            prog[p++]=ch;  

    }while(ch!='#');  

      

    p=0;  

    do{  

            scaner();  //调用子函数

            switch(syn)  

            {  

                case 11:  

                    printf("( %-10d%5d )\n",sum,syn);  

                break;  

                  

                case -1:  

                    printf("你输入的字符串有错!\n");    

                    return 0;  

                break;  

                  

                default:   

                printf("( %-10s%5d )\n",token,syn);  

                break;  

            }  

        }while(syn!=0);  

 }  

void scaner()  

{    

    sum=0;  

      

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

        token[m++]=NULL;  

      

        ch=prog[p++];  

        m=0;  

          

    while((ch==' ')||(ch=='\n'))  

        ch=prog[p++];  

      

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  

     {   

        while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  

        {  

            token[m++]=ch;  

            ch=prog[p++];  

        }  

          

        p--;  

        syn=10;  

  

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

        if(strcmp(token,rwtab[n])==0)  

        {   

            syn=n+1;  

            break;  

        }  

     }  

     else if((ch>='0')&&(ch<='9'))  

     {   

        while((ch>='0')&&(ch<='9'))  

        {  

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

            ch=prog[p++];  

        }  

        p--;  

        syn=11;  

    }  

    else   

    {  

        switch(ch)  

        {  

        case '<':  

            token[m++]=ch;  

            ch=prog[p++];  

            if(ch=='=')  

            {   

                syn=22;  

                token[m++]=ch;  

            }  

            else  

            {    

                syn=20;  

                p--;  

            }  

        break;  

  

        case '>':  

            token[m++]=ch;  

            ch=prog[p++];  

            if(ch=='=')  

            {  

                syn=24;  

                token[m++]=ch;  

            }  

            else  

            {   

                syn=23;  

                p--;  

            }  

        break;  

  

        case '+':  

            token[m++]=ch;  

            ch=prog[p++];  

            if(ch=='+')  

            {  

                syn=17;  

                token[m++]=ch;  

            }  

            else  

            {  

                syn=13;  

                p--;  

            }  

        break;  

  

        case '-':  

            token[m++]=ch;  

            ch=prog[p++];  

            if(ch=='-')  

            {  

                syn=29;  

                token[m++]=ch;  

            }  

            else  

            {   

                syn=14;  

                p--;  

            }  

        break;  

  

        case '!':  

            ch=prog[p++];  

            if(ch=='=')  

            {   

                syn=21;  

                token[m++]=ch;  

            }  

            else  

            {   

                syn=31;  

                p--;  

            }  

        break;  

  

        case '=':  

            token[m++]=ch;  

            ch=prog[p++];  

            if(ch=='=')  

            {  

                syn=25;  

                token[m++]=ch;  

            }  

            else  

            {  

                syn=18;  

                p--;  

            }  

        break;  

  

        case '*':  

            syn=15;  

            token[m++]=ch;  

        break;  

  

        case '/':  

            syn=16;  

            token[m++]=ch;  

        break;  

  

        case '(':   

            syn=27;  

            token[m++]=ch;  

        break;  

  

        case ')':  

            syn=28;  

            token[m++]=ch;  

        break;  

  

        case '{':   

            syn=5;  

            token[m++]=ch;  

        break;  

  

        case '}':   

            syn=6;  

            token[m++]=ch;  

        break;  

  

        case ';':  

            syn=26;  

            token[m++]=ch;  

        break;  

  

        case '\"':  

            syn=30;  

            token[m++]=ch;  

        break;  

  

        case '#':   

            syn=0;  

            token[m++]=ch;  

        break;  

  

        case ':':  

            syn=17;  

            token[m++]=ch;  

        break;  

  

        default:  

            syn=-1;  

        break;  

        }  

    }  

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

}

4.运行结果及分析

  对输入的字符串进行分析,以空格作为分界,we begin 12 # 。经过词法分析后把结果进行输出:we 10begin 112 11# 0

 四、 实验总结

   通过编译原理的词法分析这次实验,更加透彻地理解了词法分析的实现过程以及算法功能。在这次实验中也遇到很多的问题,在通过请教同学、网上找资料,最后得到了解决。以后我会更加认真的学习这门课程,提高自己的实际操作能力。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!