词法分析实验报告

实验一、词法分析实验

专业:商业软件三班   姓名:殷金秀  学号:201506110243

一、        实验目的

编制一个词法分析程序

二、        实验内容和要求

 输入:源程序字符串

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

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

 

  1. 1.      源程序名:压缩包文件中源程序名

可执行程序名:

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

主要总体设计问题。(包括存储结构,主要算法,关键函数的实现等)

/*存储结构以及变量*/

char character[80];//存放所有输入的字符

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

char token[8];//单词自身字符串

char ch;//单个字符

int sym;//sym:单词种别码

int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号

/*主要算法*/

if/else选择语句实现不同字符的判断 for循环语句实现一个一个的读取字符

/*提示输入字符串并从键盘获取的字符存到character[]中*/

void main()

/*识别单词并将识别出来的单词用种别码标识*/

void scanner();

 

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

实现主要功能的程序段,重要的是程序的注释解释。

while(ch==' ')//忽略空格键

    {

        ch=character[p];

        p++;

    }

    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名

    {

        m=0;

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

        {

            token[m++]=ch;

            ch=character[p++];

        }

            token[m++]='';

            p--;

            sym=10;//置标识符的单词种别至sym

            for(i=0;i<6;i++)  //将识别出来的字符和已定义的标示符作比较,

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

            {

                sym=i+1;

                break;

            }

    }

    else if((ch>='0'&&ch<='9'))//检测数字

    {

        sum=0;

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

            {

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

                ch=character[p++];

            }

            p--;

            sym=11;//置常数的单词种别至sym

            if(sum>32767)//

                sym=-1;

    }

    else switch(ch)//其他字符

    {

    case'<':m=0;token[m++]=ch;// 检测小于等于的符号

        ch=character[p++];

        if(ch=='=')

        {

            sym=21;//置单词种别为21,即小于等于符号

            token[m++]=ch;

        }

        else if(ch=='>')//检测小于大于的符号

        {

            sym=22;//置单词种别为22,即小于大于的符号

            token[m++]=ch;

        }

        else

        {

            sym=23;// 置单词种别为23,即小于的符号

            p--;

        }

        break;

    case'>':m=0;token[m++]=ch; 检测大于等于的符号

       ch=character[p++];

       if(ch=='=')

       {

           sym=24; 置单词种别为24,即大于等于符号

           token[m++]=ch;

       }

       else

       {

           sym=20; 置单词种别为20,即大于的符号

           p--;

       }

       break;

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

       ch=character[p++];

       if(ch=='=')//检测赋值符号

       {

           sym=18;// 置单词种别为18,即赋值符号

           token[m++]=ch;

       }

       else

       {

           sym=17; 置单词种别为17,即冒号

           p--;

       }

case'*': sym=13;token[0]=ch;break; 置单词种别为13,即'*'

case'/':sym=14;token[0]=ch;break; 置单词种别为14,即'/'

        case'+':sym=15;token[0]=ch;break; 置单词种别为15,即'+'

        case'-':sym=16;token[0]=ch;break; 置单词种别为16,即'-'

        case'=':sym=25;token[0]=ch;break; 置单词种别为25,即'='

        case';':sym=26;token[0]=ch;break; 置单词种别为26,即';'

        case'(':sym=27;token[0]=ch;break; 置单词种别为27,即'('

        case')':sym=28;token[0]=ch;break; 置单词种别为28,即')'

        case'#':sym=0;token[0]=ch;break; 置单词种别为0,即'#'

        case' ':sym=-2;break;

        default:sym=-1;break;

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

  

单词符号

种别码

单词符号

种别码

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

结果符合预期

单词与单词的种别码都符合

四、        实验总结

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

刚开始接触词法分析有点畏难的心理,但是当你慢慢的去敲程序,一点一点接近目标的时候,就会有点成就感,

实验过程中当然会遇到困难,比喻忘记一些学过的知识,此时我就会查找书上的内容,实验过程的难点就是识别单词并置单词的种别码为sym 遇到自己不会的就会上网查找资料。

 

原文地址:https://www.cnblogs.com/yjxblog/p/5958248.html