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

    实验一、词法分析实验

    专业:商业软件工程   姓名王芷玲  学号201606110246

    一、 实验目的

     

         编制一个词法分析程序。

    二、 实验内容和要求

         对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息。。

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

     源程序名:压缩包文件(rarzip)中源程序名 ceshi.c

    可执行程序名:ceshi.exe

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

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

    #include<stdio.h>

    #include<string.h>

    char str[100];

    char take[8];//存放单词符号的字符串

    int sum;//存放整数型单词

    char ch;

    int zbm;//存放单词字符的种别码

    int i,n,p,m=0;//p是缓冲区str的指针,mtake的指针

    char *keyword[8]={"begin","if","then","while","do","end","l(l|d)*","dd*"};

    void scanner()//词法扫描程序

    {

       /* for(i=0;i<8;i++)

        {

            take[i]=NULL;

        }

        ch=str[p++];*/

        m=0;

        sum=0;

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

            take[m]=0;

        ch=str[p++];

        while(ch==' '||ch==' ')

        {

            ch=str[p++];

        }

        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标识符或者是变量名

        {

            m=0;

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

            {

                take[m++]=ch;

                ch=str[p++];

            }

            take[m++]='';

            p--;

            zbm=10;

            for(i=0;i<6;i++)//将识别出的字符和已定义的标符进行比较

                if(strcmp(keyword[i],take==0))

            {

                zbm=i+1;

                break;

            }

        }

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

        {

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

            {

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

                ch=str[p++];

            }

            p--;

            zbm=11;

        }

        else

        {

            switch(ch)

            {

                case '+':

                    zbm=13;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '-':

                    zbm=14;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '*':

                    zbm=15;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '/':

                    zbm=16;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '<':

                    take[m++]=ch;

                    ch=str[p++];

                    if(ch=='>')

                    {

                        zbm=21;

                        take[m++]=ch;

                    }

                    else if(ch=='=')

                    {

                        zbm=22;

                    take[m]=ch;

                    }

                    else{

                        zbm=20;

                        p--;

                    }

                    break;

                case '>':

                    take[0]=ch;

                    ch=str[p++];

                    if(ch=='=')

                    {

                        zbm=24;

                    take[0]=ch;

                    }

                    else{

                        zbm=23;

                        p--;

                    }

                    break;

                case ':':

                    take[0]=ch;

                    ch=str[p++];

                    if(ch=='=')

                    {

                        zbm=18;

                    take[m++]=ch;

                    ch=str[p++];

                    }

                    else{

                        zbm=17;

                        p--;

                    }

                    break;

                case '=':

                    zbm=25;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case ';':

                    zbm=26;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '(':

                    zbm=27;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case ')':

                    zbm=28;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                case '#':

                    zbm=0;

                    take[0]=ch;

                    ch=str[p++];

                    break;

                default:

                    zbm=-1;

            }

        }

    }

    main()

    {

        int n,i;

        printf("---------------------------------------- ");

        printf(" 编制一个词法分析程序 ");

        printf(" 要求: ");

        printf(" 输入:源程序字符串 ");

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

        printf("---------------------------------------- ");

        printf("请输入您要输入的字符: ");

        do//输入一段字符串

        {

            ch=getchar();

            str[p++]=ch;

        }while(ch!='#');

        p=0;

        ch=str[0];

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

            printf("错误! ");

        else

        {

            do

            {

                scanner();

                switch(zbm)

                {

                case 11:

                    printf("(%d,%d) ",11,sum);

                    break;

                case -1:

                    printf("错误! ");

                    break;

                default:

                    printf("(%d,%s) ",zbm,take);

                }

            }while(zbm!=0);

        }

        return 0;

    }

    运行结果及分析

  • 相关阅读:
    何必言精通——十年杂感 兼谈其它 总结
    寻找自己的道路——与技术同胞共勉 一种划分为七个阶段的道路:自信=>意志=>布局=>切入点=>团队=>渠道=>产品
    务虚:大局观、方法与关键点 个人经历例子说明 一种工作应对解决的方法
    程序员“宅钱”的几种方式和我的体会 程序员其他赚钱的路径:私单、站长、开发共享软件
    怎么看待移动互联网时代 关于移动互联网时代的一点个人看法总结 在强烈的产业变化时期,主流观点是不靠谱的 什么是浪潮呢? 小型化、无线化、智能化。
    为什么现在很多年轻人愿意来北上广深打拼,即使过得异常艰苦,远离亲人,仍然义无反顾? 谈谈程序员返回家乡的创业问题 利基市场就是那些不大不小的缝隙中的市场 马斯洛的需求无层次不适合中国。国人的需求分三个层次——生存、稳定、装逼。对应的,国内的产品也分三个层次——便宜、好用、装B。人们愿意为这些掏钱
    SSM项目的数据库密码加密方案
    Python两个变量的值进行交换的方法
    Python编码问题
    Python2.7.14新手学习
  • 原文地址:https://www.cnblogs.com/zhiling123/p/5958316.html
Copyright © 2011-2022 走看看