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

    一、        实验目的

     

         编制一个词法分析程序。

    二、        实验内容和要求

     输入:源程序字符串

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

    待分析语言的词法规则。

                

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

     

    1. 1.      源程序名:123.c

    可执行程序名:123.exe

    1. 2.      原理分析及流程图

    我将需要进行翻译的对应的种别码分成了若干个数组,输入需要翻译的东西作为字符串存储在A[]的数组中,用字符ch来存储一个个的字符在进行识别类型,进行不同的函数进行识别种别码,最后输出不同的数字,然后通过选择语句得到结果。

    1. 3.      主要程序段及其解释:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h> 
    char TOken[10];//分开进行比较 
    char ch;
    
    char r1[]={"begin"};
    char r2[]={"if"};
    char r3[]={"then"};
    char r4[]={"while"};
    char r5[]={"do"};
    char r6[]={"end"};
    
    
    char A[10000];//输入的所有值 
    int syn,row;
    int n,m,p,sum,j;
    static int i = 0;
    void scaner();
    
    main()
    { 
        row = 0 ;
        p = 0 ;
        printf("请输入字符串:(#为结束)\n");
        do
        {
            scanf("%c",&ch);
            A[p]=ch;
            p++;
        }//输入值到数组A【】中,以#结束 
        while(ch!='#');
        do
        {
            scaner();//进入函数进行判定 
            switch(syn)
            {
            case 11: printf("(%d,%d)\n",syn,sum); break;//如果是11,那么就是数字 
            case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是# 结束 
            case -2: row=row++;break;
            case -1:break;
            default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词 
            }
        }
        while (syn!=0);
    }
    
    
    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';//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2...... 
            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{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=21;
            TOken[m]=ch;
            m++;
            i++;
        }
        else 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=18;
            TOken[m]=ch;
            m++;
            i++;
        }
        else
        {
            syn=17;
        }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=25;TOken[0]=ch;i++;break;
    case';':syn=26;TOken[0]=ch;i++;break;
    case'(':syn=27;TOken[0]=ch;i++;break;
    case')':syn=28;TOken[0]=ch;i++;break; 
    case'#':syn=0;TOken[0]=ch;i++;break; 
    case'\n':syn=-2;break;
    default:syn=-1;
        }
    }

    四.运行结果及分析

    五、        实验总结

    不懂词法分析里面一些操作,在进行这个程序是,要识别各种各样的类别,就要进行分类讨论,而且在空格就要跳过进行下一个识别。在看了网上一些代码与借鉴了来完成

  • 相关阅读:
    centos7 下载并安装.netcore SKD,运行.netcore 应用程序
    小网站到大网站架构的演化之路 学习总结
    suppersocke,websocket 功能学习总结
    定时任务 quartZ
    RabbitMQ 安装和功能点
    rabbitmq 发送 消费消息
    富文本编辑器
    vue AES加密解密
    css动画库
    el-table合并表格
  • 原文地址:https://www.cnblogs.com/yxbdbolgs/p/5961289.html
Copyright © 2011-2022 走看看