实验一词法分析报告

实验一、词法分析实验

专业:商业软件工程三班       姓名:郑锦诚      学号:201506110198

一、实验目的

词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。

二、实验内容和要求

让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出。

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

单词符号

种别码

单词符号

种别码

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

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

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

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

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

主要总体设计问题:本次实验程序是用顺序存储结构,关键函数为mor,没有参数,也没有返回值,全用全局变量来实现运行代码,多次使用循环语句while、do whlie以及for,也使用了判断语句if、else判断是否为符号时使用了switch语句进行执行判断。

 

  1. 3.      主要程序段及其解释:   
void mor()//主要函数的调用

{   

    sum=0;  //先把sum赋值为0

      ch=a[p++];  //把有程序段数组a的字符赋给ch,p再加一

    m=0;      //把m赋值为0

    while((ch==' ')||(ch=='\n')||(ch=='\t'))   ch=a[p++];  //判断ch是否为空格,若是则进行判断下一个字符,p再加一

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

    {//判断字符ch是否是字母,若是则赋值给数组b,ch指向判断下一个字符是否是字母或是数字,并且p加一

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

        { 

            b[m++]=ch; 

            ch=a[p++]; 

        }   

           p--; //循环结束后,p减一,为了防止漏掉字符

           syn=10; //先把syn赋值为10,再进行判断是否是保留字或是关键字

           b[m++]='\0';//并把数组b的下一位赋值为\0,这样防止系统出现混乱

           for(n=0;n<6;n++)  //循环6次进行判断是否为保留字

              if(strcmp(b,word[n])==0)    //关键字数组比较,相同则表示为关键字,种别码即为下标值加一

              {

                     syn=n+1; 

                     return; 

              } 

    }                                  

    else if((ch>='0')&&(ch<='9'))  //或者字符ch是数字的

  {  

       while((ch>='0')&&(ch<='9'))  //再次判断下一个字符是否为数字

       { 

           sum=sum*10+ch-'0';    //将字符型转化为整形sum

           ch=a[p++];  //字符ch指向下一个程序段数组a的字符

       } 

       p--;  //循环结束后,p减一,为了防止漏掉字符

       syn=11;  //数字的种别码是11

    } 

    else    //else语句内识别除关键字、标识符、数字以外的其他字符

    {  

        switch(ch) 

        { 

        case '+':  //字符ch是+的,syn赋值为13

            syn=13; 

                  b[m++]=ch;  //字符ch指向程序段数组a的下一个字符,p加一       

            break; 

        case '-':   /字符ch是-的,syn赋值为14

                  syn=14;

            b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一

            break;

           case '*': 

            syn=15; 

            b[m++]=ch;//字符ch指向程序段数组a的下一个字符,p加一 

            break; 

        case '/': 

            syn=16; 

            b[m++]=ch; /字符ch指向程序段数组a的下一个字符,p加一 

            break; 

        case ':': 

            b[m++]=ch; 

            ch=a[p++];//字符ch指向程序段数组a的下一个字符,p加一 

                  if(ch=='=')  //判断字符ch是否为=,若是则赋值到数组b中

                  { 

                         syn=18; 

                         b[m++]=ch; 

                  } 

                  else  //否则赋值为18,再p减一

                  {  

                         syn=18; 

                         p--; 

                  } 

                  break;

           case '!': //为!则结束程序

                  syn=-2;

                  break;

        default:  //输入一个错误的字符的时候

            syn=-1; 

            break; 

        } 

    } 

    b[m++]='\0';  //把数组b的下一位赋值为\0

}       运行结果及分析

四、实验运行结果

结果符合预期,词法分析程序先识别字母if进行判断,符合字符数组Word的保留字进行输出种别码以及自身的值,遇到空格就指向下一位,从而执行i,以此类推,当识别到!时程序结束。

 

五、 实验总结

难点问题:1.编译时出现死循环或不循环。

          2.输入保留字或关键字时,输出的结果没有符合预期,有时保留字变成关键字,关键字变成保留字。

解决方法:1.循环嵌套出错以及循环条件&&,||的不规范使用导致的,已修改好。

          2.在数组b的下一位等于\0,就可以解决了。

心得体会:经过这次的实践,我认识到自己的不足以及粗心,在今后的学习道路上相信会更加的出彩,多找到自己的不足,才能更好的加强自己的能力。

posted @ 2016-10-13 11:12  198郑锦诚  阅读(444)  评论(3编辑  收藏  举报