简单词法分析实验报告238许锦沛 238

实验一、词法分析实验

专业 :商业软件工程  姓名:许锦沛  学号:201506110238

一.实验目的

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

二.实验内容和要求

实验内容:

1.语言的单词符号:

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

(2)    标识符:表示各种名字,如变量名,数组名,函数名等,如char ch, int syn, token, sum等。

(3)    常数:如123, 4587等。

(4)    运算符:如+,—,*,/,:=,<=,>,< >等。

(5)    界符: () :  ;  ,等。

2.词法分析的主要任务:

(1)I :对字符串表示的源程序。

(2)P :从左到右进行扫描和分解(根据词法规则)。

(3)O :识别出一个一个具有独特意义的单词符号(以供词法分析之用)。

(4)E :发现词法错误,则返回出错误信息,如-1。

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

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

单词符号

种别码

单词符号

种别码

bgin

1

17

If

2

:=

18

Then

3

20

wile

4

<> 

21

do

5

<=

22

end

6

23

10

>=

24

11

=

25

+

13

26

14

(

27

*

15

)

28

/

16

#

0

实验要求:

1.输入:源程序字符串。

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

3.其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。

 

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

1.源程序名:简单词法分析.c

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

2.原理分析及流程图

 

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

 10 void scaner()
 11 {
 12     /*
 13         共分为三大块,分别是标示符、数字、符号,对应下面的 if   else if  和 else
 14 
 15 
 16     */
 17     for(n=0;n<8;n++) token[n]=NULL;
 18     ch=prog[p++];
 19     while(ch==' ')
 20     {
 21         ch=prog[p];
 22         p++;
 23     }
 24     if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  //可能是标示符或者变量名
 25     {
 26         m=0;
 27         while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
 28         {
 29             token[m++]=ch;
 30             ch=prog[p++];
 31         }
 32         token[m++]='\0';
 33         p--;
 34         syn=10;
 35         for(n=0;n<6;n++)  //将识别出来的字符和已定义的标示符作比较,
 36             if(strcmp(token,rwtab[n])==0)
 37             {
 38                 syn=n+1;
 39                 break;
 40             }
 41     }
 42     else if((ch>='0'&&ch<='9'))  //数字
 43     {
 44         {
 45             sum=0;
 46             while((ch>='0'&&ch<='9'))
 47             {
 48                 sum=sum*10+ch-'0';
 49                 ch=prog[p++];
 50             }
 51         }
 52         p--;
 53         syn=11;
 54         if(sum>32767)
 55             syn=-1;
 56     }
 57     else switch(ch)   //其他字符
 58     {
 59         case'<':m=0;token[m++]=ch;
 60             ch=prog[p++];
 61             if(ch=='>')
 62             {
 63                 syn=21;
 64                 token[m++]=ch;
 65             }
 66             else if(ch=='=')
 67             {
 68                 syn=22;
 69                 token[m++]=ch;
 70             }
 71             else
 72             {
 73                 syn=23;
 74                 p--;
 75             }
 76             break;
 77         case'>':m=0;token[m++]=ch;
 78             ch=prog[p++];
 79             if(ch=='=')
 80             {
 81                 syn=24;
 82                 token[m++]=ch;
 83             }
 84             else
 85             {
 86                 syn=20;
 87                 p--;
 88             }
 89             break;
 90         case':':m=0;token[m++]=ch;
 91             ch=prog[p++];
 92             if(ch=='=')
 93             {
 94                 syn=18;
 95                 token[m++]=ch;
 96             }
 97             else
 98             {
 99                 syn=17;
100                 p--;
101             }
102             break;
103         case'*':syn=13;token[0]=ch;break;
104         case'/':syn=14;token[0]=ch;break;
105         case'+':syn=15;token[0]=ch;break;
106         case'-':syn=16;token[0]=ch;break;
107         case'=':syn=25;token[0]=ch;break;
108         case';':syn=26;token[0]=ch;break;
109         case'(':syn=27;token[0]=ch;break;
110         case')':syn=28;token[0]=ch;break;
111         case'#':syn=0;token[0]=ch;break;
112         case'\n':syn=-2;break;
113         default: syn=-1;break;
114     }
115 }

4.运行结果及分析

1).测试例子为;begin x=9;

If x>0  then  x:2*x+1/4; end#

2).测试结果如下图所示;

实验运行结果

四.实验总结

在这次的实验中,了解词法分析的操作过程以及编译原理中的一些词法规则,解决如何将程序代码转化为字符串等相关问题。但是,第一次接触编译原理,对编译原理的词法分析器还是不了解。比如说syn为单词种别码;token为存放的单词自身字符串等问题都不清楚。希望今后多加练习,提高自我编译水平。 

 

原文地址:https://www.cnblogs.com/xujinpei/p/5957264.html