• 实验报告词法分析.c


    实验一、词法分析程序

    商业软件工程   简梓茵  201506110132

    一、        实验目的

     

    熟悉词法分析的形式。

    二、        实验内容和要求

         对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号

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

     

    1. 1.      源程序名:wordanalyse.c
    2. 2.      原理分析及流程图 

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

    #include <stdio.h> 

    #include <string.h> 

    char prog[80],token[8],ch; 

    int syn,p,m,n,sum; 

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

      

    void scaner(void); 

    main() 

        p=0; 

        printf("\n please input a string(end with '#'):\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("you have input a wrong string\n"); 

                        //getch(); 

                        return 0; 

                    break; 

                     

                    default:  

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

                    break; 

                } 

            }while(syn!=0); 

        //getch(); 

     } 

     //=================================对录入的词汇进行解析

    void scaner(void) 

    {   

        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'; 

    1. 4.      运行结果及分析

     

    运行正常。

    四、        实验总结

    很多地方都纠结了好久,

    包括符号处理,符号处理需要分类讨论。

    另外还有就是空格和回车的处理,以及字符的读取处理。

    为了提高程序效率,关键字处理最后用了指针数组来存储关键字。

     

  • 相关阅读:
    IDEA成功注册方法
    H2O中的随机森林算法介绍及其项目实战(python实现)
    scala语言简介及其环境安装
    SparkSQL---实战应用
    Spark算子---实战应用
    利用python的KMeans和PCA包实现聚类算法
    Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS
    m个苹果放在n个盘子里面有多少种放法?(动态规划)
    Java_CookieUtil
    Jquery_AjaxFileUpload插件的使用记录
  • 原文地址:https://www.cnblogs.com/CatalpaOvata132/p/5961462.html
Copyright © 2020-2023  润新知