实验一、词法分析实验

实验一、词法分析实验

专业:商软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("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 !\n");

    do

    {

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

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

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

    a=0;

   

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

 

void scaner()

{

   

   

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

    {token[n]='\0';}

    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("词法分析出错! 请检查是否输入非法字符\n");zbm=-1;break;

                 

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

 

    do

    {

           scaner();

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

     

    }while(zbm!=0);

 

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

   

    getchar();

   

}

 2.      运行结果及分析

一、        实验总结

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

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

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

 

 

posted @ 2016-10-14 15:51  168李文辉  阅读(266)  评论(4编辑  收藏  举报