词法分析实验报告

author author     2022-08-08     168

关键词:

格式说明:排版时注意按此模板的字体,字号和行距。

报告提交和打印输出时请去掉此框。

 

实验一、词法分析实验

专业:商业软件工程   姓名:陈蔓嘉  学号:201506110245

一、        实验目的

 

     编制一个词法分析程序。

 

二、        实验内容和要求

输入:源程序字符串

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

 

内容及要求:

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

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

3.根据词法规则

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

5.以供语法分析之用

 

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

实验方法:

 

  1. 1.      源程序名:压缩包文件(rarzip
  2. 2.      源程序名:词法分析程序.c
  1. 3.      可执行程序名:词法分析程序.exe
  1. 4.      原理分析及流程图

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

主函数主要算法:

do{

        scanf("%c",&ch);

        A[p]=ch;

        p++;

      }while(ch!=‘@‘);/*将输入的语句分别存入数组A[]中,@出现时结束语句*/

      do

        {

            scaner();//进入函数进行判定

            switch(syn)

            {

                case 11: printf("(%d,%d)\n",syn,sum); break;//如果是11,那么就是数字

                case -2: row=row++;break;

                default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词

                 }

        }while (syn!=0);

 流程图:

技术分享

 

关键函数:

void scaner()/*分别对标示符、数字、符号进行分析*/

{

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

        TOken[n]=0;/*每次循环完就清零*/

    ch=A[i];

    while(ch==‘ ‘||ch==‘\n‘)/*如果字符是空格或者回车,跳过*/

        {

            i++;

            ch=A[i];

        }

        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;m++;

                i++;ch=A[i];

            }

        TOken[m]=‘\0‘;/*将识别出来的字符和已定义的标示符作比较,输出其种别码*/

        if(strcmp(TOken,r1)==0){syn=1;}

            else if(strcmp(TOken,r2)==0){syn=2;}

            else if(strcmp(TOken,r3)==0){syn=3;}

            else if(strcmp(TOken,r4)==0){syn=4;}

            else if(strcmp(TOken,r5)==0){syn=5;}

            else if(strcmp(TOken,r6)==0){syn=6;}

            else if(strcmp(TOken,r7)==0){syn=7;}

            else if(strcmp(TOken,r8)==0){syn=8;}

            else if(strcmp(TOken,r9)==0){syn=9;}

 

        else{syn=10;}//从for开始到这里结束,是对标示符或者变量名的识别。

        }

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

        {

            sum=0;

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

            {

                sum=sum*10+ch-‘0‘;//显示其对应数字sum

                i++;

                ch=A[i];

            }

            syn=11;

        }//这一段是对数字三识别。

        else switch(ch) //有两个的字符

            {

                case‘<‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘)

                {

                    syn=22;//<=

                    TOken[m]=ch;m++;i++;

                }

           else{syn=20;}break;//<

 

                case‘>‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘){

                    syn=24;//>=

                    TOken[m]=ch;m++;i++;

                }

            else{syn=23;}break;//>

 

                case‘:‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘)

                {

                    syn=32;//:=

                    TOken[m]=ch;m++;i++;

                }

                else

                    {syn=17;}break;//:

 

                case‘@‘:syn=0;TOken[0]=ch;i++;break;

                case‘=‘:syn=12;TOken[0]=ch;i++;break;

                case‘+‘:syn=13;TOken[0]=ch;i++;break;

                case‘-‘:syn=14;TOken[0]=ch;i++;break;

                case‘*‘:syn=15;TOken[0]=ch;i++;break;

                case‘/‘:syn=16;TOken[0]=ch;i++;break;

                case‘{‘:syn=18;TOken[0]=ch;i++;break;

                case‘}‘:syn=19;TOken[0]=ch;i++;break;

                case‘(‘:syn=26;TOken[0]=ch;i++;break;

                case‘)‘:syn=27;TOken[0]=ch;i++;break;

                case‘;‘:syn=33;TOken[0]=ch;i++;break;

                case‘.‘:syn=34;TOken[0]=ch;i++;break;

                case‘\n‘:syn=-2;break;

                default: syn=-1;break;

            }//这一部分是对符号的识别。

}

关键函数流程图:

 技术分享

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

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

void scaner()/*分别对标示符、数字、符号进行分析*/

{

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

        TOken[n]=0;/*每次循环完就清零*/

    ch=A[i];

    while(ch==‘ ‘||ch==‘\n‘)/*如果字符是空格或者回车,跳过*/

        {

            i++;

            ch=A[i];

        }

        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;m++;

                i++;ch=A[i];

            }

        TOken[m]=‘\0‘;/*将识别出来的字符和已定义的标示符作比较,输出其种别码*/

        if(strcmp(TOken,r1)==0){syn=1;}

            else if(strcmp(TOken,r2)==0){syn=2;}

            else if(strcmp(TOken,r3)==0){syn=3;}

            else if(strcmp(TOken,r4)==0){syn=4;}

            else if(strcmp(TOken,r5)==0){syn=5;}

            else if(strcmp(TOken,r6)==0){syn=6;}

            else if(strcmp(TOken,r7)==0){syn=7;}

            else if(strcmp(TOken,r8)==0){syn=8;}

            else if(strcmp(TOken,r9)==0){syn=9;}

 

        else{syn=10;}

        }

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

        {

            sum=0;

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

            {

                sum=sum*10+ch-‘0‘;//显示其对应数字sum

                i++;

                ch=A[i];

            }

            syn=11;

        }

        else switch(ch) //有两个的字符

            {

                case‘<‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘)

                {

                    syn=22;//<=

                    TOken[m]=ch;m++;i++;

                }

           else{syn=20;}break;//<

 

                case‘>‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘){

                    syn=24;//>=

                    TOken[m]=ch;m++;i++;

                }

            else{syn=23;}break;//>

 

                case‘:‘:m=0;TOken[m]=ch;m++;

                i++;ch=A[i];

                if(ch==‘=‘)

                {

                    syn=32;//:=

                    TOken[m]=ch;m++;i++;

                }

                else

                    {syn=17;}break;//:

 

                case‘@‘:syn=0;TOken[0]=ch;i++;break;

                case‘=‘:syn=12;TOken[0]=ch;i++;break;

                case‘+‘:syn=13;TOken[0]=ch;i++;break;

                case‘-‘:syn=14;TOken[0]=ch;i++;break;

                case‘*‘:syn=15;TOken[0]=ch;i++;break;

                case‘/‘:syn=16;TOken[0]=ch;i++;break;

                case‘{‘:syn=18;TOken[0]=ch;i++;break;

                case‘}‘:syn=19;TOken[0]=ch;i++;break;

                case‘(‘:syn=26;TOken[0]=ch;i++;break;

                case‘)‘:syn=27;TOken[0]=ch;i++;break;

                case‘;‘:syn=33;TOken[0]=ch;i++;break;

                case‘.‘:syn=34;TOken[0]=ch;i++;break;

                case‘\n‘:syn=-2;break;

                default: syn=-1;break;

            }

}

  1. 6.      运行结果及分析

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

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

 技术分享

技术分享

四、        实验总结

 

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

在写词法分析的过程中,难点问题主要是关键字和变量名的分辨,在循环程序中卡主了,其他问题还好。在分辨期间,我首先让这个词循环,查找,循环完就清零。如果是标示符或者变量名,找到一个变量名或者关键字,直到遇到空格为止,将识别出来的字符和已定义的标示符作比较,输出其种别码。这是我这一实验学到的最大的东西。

 

 

 

 

 

 

 

 

 

实验报告-词法分析

---恢复内容开始---实验一、词法分析实验专业:商软二班  姓名:黄思慧 学号:201506110189一、       实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握... 查看详情

词法分析实验报告

 实验一、词法分析实验专业商业软件工程 姓名黄施策 学号201506110228一、       实验目的    编制一个词法分析程序。二、       实验内容和要求 &nb... 查看详情

词法分析实验报告

实验一、词法分析实验商务软件工程三班  吴文成 201506110217一、       实验目的调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能... 查看详情

词法分析实验报告1

实验一、词法分析实验商软二班张智恒201506110172一、       实验目的     编制一个词法分析程序 二、       实验内容和要求编写一个词法分析程序,使其能... 查看详情

词法分析实验报告

实验一、词法分析实验专业:商业软件工程 姓名:程嘉明 学号:201506110185一、 实验目的通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解后各类单词的词法分析方... 查看详情

词法分析实验报告

实验一:词法分析专业:商业软件工程  姓名:陈锐 学号:201506110103一、       实验目的     编制一个词法分析程序。二、       实验内容和要求1.... 查看详情

词法分析实验报告

实验一、词法分析实验专业:商业软件工程  姓名: 陈 瑾学号:201506110101一、       实验目的     编制一个词法分析程序 二、        查看详情

词法分析实验报告

...行距。报告提交和打印输出时请去掉此框。 实验一、词法分析实验专业:商业软件工程  姓名:陈蔓嘉 学号:201506110245一、       实验目的     编制一个词法分析程序。... 查看详情

词法分析实验报告

实验一、词法分析实验商业软件工程 符致伟 201506110157一、       实验目的 编制一个词法分析程序二、       实验内容和要求 输入:源程序字符串 输出:二元... 查看详情

词法分析实验报告

...行距。报告提交和打印输出时请去掉此框。 实验一、词法分析实验  商软二班张智恒201506110172一、       实验目的     编制一个词法分析程序 二、    查看详情

词法分析实验报告

 实验一、词法分析器实验专业:商软工程3班  姓名:林美全 学号:201506110220一、       实验目的设计,编制一个简单词法分析程序对输入字符串进行识别并做简单有效输出从而加深对词... 查看详情

实验一词法分析实验报告

实验一、词法分析实验专业:商业软件工程2班 姓名别博文 学号201606110175一、 实验目的      编制一个词法分析程序。 二、 实验内容和要求     对字符串表示的源程序... 查看详情

词法分析实验报告

实验一、词法分析实验专业商业软件3班 姓名林鑫杰学号201506110211一、       实验目的 编制一个词法分析程序。 二、       实验内容和要求输入:源程序字符串输出... 查看详情

实验报告1—’词法分析

实验一、词法分析实验专业:商业软件工程  姓名:钟菲菲 学号:201506110191一、        实验目的 编制一个词法分析程序 二、        实验内容和要求&nb... 查看详情

词法分析实验报告

实验一、词法分析程序实验专业:商业软件  姓名:杨链新 学号:201506110113一、       实验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解... 查看详情

词法分析程序实验报告

实验一词法分析实验商业软件工程2班 黄铭坤 201506110147一、        实验目的      编制一个词法分析程序。二、        实验内容和 查看详情

词法分析-实验报告

...    实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、      实验内... 查看详情

词法分析程序实验报告

实验一、词法分析实验专业:商业软件工程  姓名王芷玲 学号201606110246一、 实验目的      编制一个词法分析程序。 二、 实验内容和要求     对字符串表示的源程序... 查看详情