zoukankan      html  css  js  c++  java
  • 实验一、词法分析实验

    实验一、词法分析实验

    专业:商软2班   姓名:李文辉  学号:201506110168

    一、        实验目的

     

         编制一个词法分析程序

    二、        实验内容和要求

         实验内容:1.对字符串表示的源程序

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

    3.根据词法规则

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

    5.以供语法分析之用

    6.发现词法错误,则返回出错信息

    实验要求:输入:源程序字符串

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

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

     

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

    可执行程序名:lwh.exe

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

    1、设置全局变量

            1)char sum[]  把用户输入字符存到数组里面的

     2)char ch     判断输入的字符的组成部分

     3)char token[] 存放sum[]以及ch

     4)*keyword[]  存放关键字

         2、关键字表

    *keyword[18]={"begin","and","const","long","float","double","void","main","if",       "else","then","break","int","char","include","for","while","printf"}

     

     3、关键函数

     void scaner()  词法扫描及其判断程序

      void main()   用户输入与输出

    流程图:

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

    1、用于输入,直到用户输入#则跳出循环

    void main()

    {

        printf("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 ! ");

        do

        {

               ch=getchar();//输入字符

               sum[a++]=ch;//把字符存到数组里

        }while(ch!='#');//以#为循环条件

        a=0;

       

    3、让token函数为空,判断标示符前的是否为空格,有则ch要进一位

    void scaner()

    {

       

       

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

        {token[n]='';}

        n=0;

        ch=sum[a++];//全局变量p=0

        while(ch==' '){ch=sum[a++];}//有空格就继续(判断标识符前是否存在空格)

       

    4、判断输入的字符类型,若为英文字符则输出种别码zbm=21

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

        {

               do{

                      token[n++]=ch;

                      ch=sum[a++];

               }while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z'));

               zbm=21;

              

    5、     判断英文是否和关键字完全一样,是则输出各关键字种别码

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

               {

                      if(strcmp(token,keyword[n])==0)//判断英文是否和关键字完全一样

               {

                      zbm=n+1;

                     

               }

               }

               a--;

       

        }

    6、判断用户输入是否为数字,若是则输出种别码zbm=22

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

        {

               a--;

               do

               {

                      token[n++]=sum[a++];

                      ch=sum[a];

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

               zbm=22;

              

              

               return;

        }

    7、判断其他字符的种别码

        else

        {

              

       

               switch(ch)

               {

               case '+':zbm=24;token[0]=ch;break;

               case '-':zbm=25;token[0]=ch;break;

               case '*':zbm=26;token[0]=ch;break;

               case '/':zbm=27;token[0]=ch;break;

               case ':':zbm=28;token[0]=ch;

                      ch=sum[a++];

                      if(ch=='='){token[1]=ch;zbm++;}

                      else a--;

                      break;

               case '<':zbm=30;token[0]=ch;

                      ch=sum[a++];

                      if(ch=='='){token[1]=ch;zbm++;}

                      else if(ch=='>'){token[1]=ch;zbm=zbm+2;}

                      else a--;

                      break;

               case '>':zbm=33;token[0]=ch;

                      ch=sum[a++];

                      if(ch=='='){token[1]=ch;zbm++;}

                      else a--;

                      break;

               case '=':zbm=35;token[0]=ch;break;

               case ';':zbm=36;token[0]=ch;break;

               case '(':zbm=37;token[0]=ch;break;

               case ')':zbm=38;token[0]=ch;break;

               case '{':zbm=39;token[0]=ch;break;

               case '}':zbm=40;token[0]=ch;break;

               case '!':zbm=41;token[0]=ch;break;

               case '@':zbm=42;token[0]=ch;break;

               case '$':zbm=43;token[0]=ch;break;

               case '%':zbm=44;token[0]=ch;break;

               case '^':zbm=45;token[0]=ch;break;

               case '&':zbm=46;token[0]=ch;break;

               case '#':zbm=0;token[0]=ch;break;

                     

               default: printf("词法分析出错! 请检查是否输入非法字符 ");zbm=-1;break;

                     

    8、对用户输入的字符进行判断,并输入各字符类型的种别码zmb。直到zmb为0,则跳出循环,循环结束。

        do

        {

               scaner();

               printf("<%d,%s> ",zbm,token);

         

        }while(zbm!=0);

        printf("感谢使用该系统 ");

       

        getchar();

       

    }

     2.      运行结果及分析

    一、        实验总结

    1、通过与同学的交流,掌握了主要方法后发现其原理十分简单,把每一种类型都分开出来特殊处理就可以了

    2、感觉像是复习了大一C语言的内容,对这么课有了更深了理解

    3、编译原理这门课程对c有很大的改进,通过学习这门课程能使自己在编写程序方面有很大的帮助

     

  • 相关阅读:
    Queue
    List
    面试1
    野指针和空指针
    指针的定义和使用
    多文件编程
    函数声明
    函数样式
    字符串比较
    函数的定义和使用
  • 原文地址:https://www.cnblogs.com/168-hui/p/5960786.html
Copyright © 2011-2022 走看看