zoukankan      html  css  js  c++  java
  • 词法分析实验报告

    实验一、词法分析实验

    专业:商业软件工程   姓名:吴梅英  学号:201506110188

    一、 实验目的

    编制一个词法分析程序,加深对编译原理的理解,掌握编译程序的实现方法。 

    二、 实验内容和要求

    (1) 输入:源程序字符串。

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

    (3) 待分析语言的词法规则。

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

    1.源程序名:压缩包文件(rarzip)中源程序名 :词法分析.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

    letter (letter | digit)*

    10

    >=

    24

    digit digit*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

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

    主要功能:输入:所给文法的源程序字符串。

              输出:二元组(syn,tokensum)构成的序列。

              其中:syn为单词种别码;

                    token为存放的单词自身字符串;

                    sum为整型常数

    主要程序:

    main()  

    {  

        p=0;  

        printf("\n 请输入字符串('#'结束):\n");  

          

        do{  

                scanf("%c",&ch);  //输入字符串

                prog[p++]=ch;  

        }while(ch!='#');  

          

        p=0;  

        do{  

                scaner();  //调用子函数

                switch(syn)  

                {  

                    case 11:  

                        printf("( %-10d%5d )\n",sum,syn);  

                    break;  

                      

                    case -1:  

                        printf("你输入的字符串有错!\n");    

                        return 0;  

                    break;  

                      

                    default:   

                    printf("( %-10s%5d )\n",token,syn);  

                    break;  

                }  

            }while(syn!=0);  

     }  

    void scaner()  

    {    

        sum=0;  

          

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

            token[m++]=NULL;  

          

            ch=prog[p++];  

            m=0;  

              

        while((ch==' ')||(ch=='\n'))  

            ch=prog[p++];  

          

        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  

         {   

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

            {  

                token[m++]=ch;  

                ch=prog[p++];  

            }  

              

            p--;  

            syn=10;  

      

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

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

            {   

                syn=n+1;  

                break;  

            }  

         }  

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

         {   

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

            {  

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

                ch=prog[p++];  

            }  

            p--;  

            syn=11;  

        }  

        else   

        {  

            switch(ch)  

            {  

            case '<':  

                token[m++]=ch;  

                ch=prog[p++];  

                if(ch=='=')  

                {   

                    syn=22;  

                    token[m++]=ch;  

                }  

                else  

                {    

                    syn=20;  

                    p--;  

                }  

            break;  

      

            case '>':  

                token[m++]=ch;  

                ch=prog[p++];  

                if(ch=='=')  

                {  

                    syn=24;  

                    token[m++]=ch;  

                }  

                else  

                {   

                    syn=23;  

                    p--;  

                }  

            break;  

      

            case '+':  

                token[m++]=ch;  

                ch=prog[p++];  

                if(ch=='+')  

                {  

                    syn=17;  

                    token[m++]=ch;  

                }  

                else  

                {  

                    syn=13;  

                    p--;  

                }  

            break;  

      

            case '-':  

                token[m++]=ch;  

                ch=prog[p++];  

                if(ch=='-')  

                {  

                    syn=29;  

                    token[m++]=ch;  

                }  

                else  

                {   

                    syn=14;  

                    p--;  

                }  

            break;  

      

            case '!':  

                ch=prog[p++];  

                if(ch=='=')  

                {   

                    syn=21;  

                    token[m++]=ch;  

                }  

                else  

                {   

                    syn=31;  

                    p--;  

                }  

            break;  

      

            case '=':  

                token[m++]=ch;  

                ch=prog[p++];  

                if(ch=='=')  

                {  

                    syn=25;  

                    token[m++]=ch;  

                }  

                else  

                {  

                    syn=18;  

                    p--;  

                }  

            break;  

      

            case '*':  

                syn=15;  

                token[m++]=ch;  

            break;  

      

            case '/':  

                syn=16;  

                token[m++]=ch;  

            break;  

      

            case '(':   

                syn=27;  

                token[m++]=ch;  

            break;  

      

            case ')':  

                syn=28;  

                token[m++]=ch;  

            break;  

      

            case '{':   

                syn=5;  

                token[m++]=ch;  

            break;  

      

            case '}':   

                syn=6;  

                token[m++]=ch;  

            break;  

      

            case ';':  

                syn=26;  

                token[m++]=ch;  

            break;  

      

            case '\"':  

                syn=30;  

                token[m++]=ch;  

            break;  

      

            case '#':   

                syn=0;  

                token[m++]=ch;  

            break;  

      

            case ':':  

                syn=17;  

                token[m++]=ch;  

            break;  

      

            default:  

                syn=-1;  

            break;  

            }  

        }  

            token[m++]='\0';  

    }

    4.运行结果及分析

      对输入的字符串进行分析,以空格作为分界,we begin 12 # 。经过词法分析后把结果进行输出:we 10begin 112 11# 0

     四、 实验总结

       通过编译原理的词法分析这次实验,更加透彻地理解了词法分析的实现过程以及算法功能。在这次实验中也遇到很多的问题,在通过请教同学、网上找资料,最后得到了解决。以后我会更加认真的学习这门课程,提高自己的实际操作能力。

     

  • 相关阅读:
    时间段内随机生成日期函数
    已知目标qps跟并发用户数20,压测平均响应时间实例
    并发数 = QPS*平均响应时间
    性能测试实战-XYB项目-内网访问
    linux安装jmeter
    word设置
    nginx安装【windows下安装】
    mac 修改权限为当前用户用户组
    兼容性测试
    linux 的一些命令
  • 原文地址:https://www.cnblogs.com/wumeiying/p/5961202.html
Copyright © 2011-2022 走看看