首页 > 代码库 > 实验一

实验一

实验一、词法分析程序实验

商业软件工程  张宇健 201506110176

实验目的

 

     编制一个词法分析程序。

 

实验内容:

1. 对字符串表示的源程序

2. 从左到右进行扫描和分解

3. 根据词法规则:

单词符号

种别码

单词符号

种别码

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

4. 识别出一个一个具有独立意义的单词符号

5. 以供语法分析之用

6. 发现词法错误,则返回出错信息。

实验要求:

输入:源程序字符串

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

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

 

源程序名:

源程序名: 实验1.c

可执行程序名:实验1.exe

原理分析及流程图

1) 存储结构:一维顺序数组存储。

2) 算法关键定义:

01. 定义全局变量o存放单词种别码

02. 定义数组x存放整个字符串,数组z存放临时字符串

03. 定义数组y存放关键字

3) 流程图:

技术分享 

技术分享 

技术分享 

技术分享技术分享技术分享 

 

技术分享 

技术分享         N

技术分享 

技术分享 

技术分享 

技术分享 N

技术分享技术分享技术分享 

Y N

技术分享技术分享技术分享技术分享 

技术分享 

技术分享      Y

技术分享技术分享 

技术分享 

技术分享技术分享 

技术分享技术分享 

技术分享技术分享技术分享 

Y

技术分享技术分享 

技术分享技术分享 

技术分享 N

 

技术分享技术分享 

技术分享 

技术分享 N

技术分享 

技术分享技术分享 

 

技术分享 

Y

技术分享 

 

源代码

#include<stdio.h>

#include<string.h>

#include<math.h>

#define n 100

void ss();

char *y[n]={"begin","if","then","while","do","end"},x[n],ch,z[8];

int i,j=0,k,o;

main()

{

    printf("请输入你需要查询的字符串(#结束)");

    do{

        ch=getchar();

        x[j++]=ch;

    }while(ch!=‘#‘);

    j=0;

    do

{

ss();

switch(o)

{

case -1:printf("词法分析 出错\n");break;

default :printf("<%d,%s>\n",o,z);break;

}

}while(o!=0);

printf("词法分析 成功\n");

getchar();

 

}

void ss()

{

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

    {

       z[k]=‘\0‘;

    }

    k=0;

    ch=x[j++];

    while(ch==‘ ‘)

    {

        ch=x[j++];

    }

    if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘0‘&&ch<=‘9‘))

    {

        do{

            z[k++]=ch;

            ch=x[j++];

        }while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘));

        o=10;

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

        {

            if(strcmp(z,y[i])==0)

                o=i+1;

        }

        j--;

    }

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

    {

        j--;

        do{

            z[k++]=x[j++];

            ch=x[j];

        }while(ch>=‘0‘&&ch<=‘9‘);

       o=11;

       return;

    }

    else

{

switch(ch)

{

case ‘+‘:o=13;z[0]=ch;break;

case ‘-‘:o=14;z[0]=ch;break;

case ‘*‘:o=15;z[0]=ch;break;

case ‘/‘:o=16;z[0]=ch;break;

case ‘:‘:o=17;z[0]=ch;

ch=x[j++];

if(ch==‘=‘){z[1]=ch;o++;}

else j--;

break;

case ‘<‘:o=20;z[0]=ch;

ch=x[j++];

if(ch==‘>‘){z[1]=ch;o++;}

else if(ch==‘=‘){z[1]=ch;o=o+2;}

else j--;

break;

case ‘>‘:o=23;z[0]=ch;

ch=x[j++];

if(ch==‘=‘){z[1]=ch;o++;}

else j--;

break;

case ‘=‘:o=25;z[0]=ch;break;

case ‘;‘:o=26;z[0]=ch;break;

case ‘(‘:o=27;z[0]=ch;break;

case ‘)‘:o=28;z[0]=ch;break;

case ‘#‘:o=0;z[0]=ch;break;

default: printf("词法分析出错! 请检查是否输入非法字符\n");o=-1;break;

}

}

}

实验一