词法分析程序实验报告

巧了我就是萌 提交于 2020-02-04 02:36:28

实验一词法分析实验

商业软件工程2班  黄铭坤  201506110147

一、        实验目的

       编制一个词法分析程序。

二、        实验内容和要求

输入:源程序字符串

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

待分析语言的词法规则

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

 1.      源程序名:词法分析.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

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

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

void Analyse(char a[])//词法分析的主要函数

{

    int i=0,j=0,n=0,m=0,temp=0;

    char b[N];//数组b存储数组a中除关键字外的其他字母

    while(a[i]!='$')//对输入的单词符号进行识别判断是否为关键字或标志符,若是则输出单词本身及其词法规则和种别码

    {

         if(a[i]>=65&&a[i]<=122)//判断每一个单词符号是否为字母

        {

            j=0;

            while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')

            {

                b[j]=a[i];

                j++;

                i++;

            }

            i--;

            b[j]='\0';

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

            {

                if(strcmp(b,word[n])==0)

                {

                                printf("<关键字,%d,",n+1);

                                while(word[n][m]!='\0')

                                {

                                       printf("%c",word[n][m]);

                                       m++;

                                }

                                printf(">\n");

                                temp=1;

                }

                  }

                  if(temp==0)

                         printf("<标识符,10,%s>\n",b);

 

         }

         else

         {

            switch(a[i])//用switch结构实现对界符和运算符的识别和其词法规则和种别码的输出

            {

                  case '#': printf("<0,$>\n");

            case '+': printf("<运算符,13,+>\n");break;

            case '-': printf("<运算符,14,->\n");break;

            case '*': printf("<运算符,15,*>\n");break;

            case '/': printf("<运算符,16,/>\n");break;

            case ':':if(a[i+1]=='=')

                     {

                         printf("<运算符,18,:=>\n");

                         i++;

                     }

                else printf("<界符,17,:>\n");

                break;

            case '<': if(a[i+1]=='=')

                     {

                         printf("<运算符,21,<=>\n");

                         i++;

                     }

                else if(a[i+1]=='>')

                {

                    printf("<运算符,22,<>>\n");

                    i++;

                }

                else printf("<界符,20,<>\n");

                break;

            case '>': if(a[i+1]=='=')

                     {

                         printf("<运算符,24,>=>\n");

                         i++;

                     }

                else printf("<界符,23,>>\n");

                break;

            case '=': printf("<运算符,25,=>\n");break;

            case ';': printf("<界符,26,;>\n");break;

            case '(': printf("<界符,27,(>\n");break;

            case ')': printf("<界符,28,)>\n");break;

            case' ': break;

            case'\n': break;

            default:

                if(a[i]>='0'&&a[i]<='9')   

                    printf("<数字,%c>\n",a[i]);

                else

                    printf("'%c'输入错误!\n",a[i]);//若输入的单词符号为其他,则输出“输入错误”

                    break;

            }

         }

         i++;

    }

 

}

4.      运行结果及分析

 

四、        实验总结

 

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