实验一、词法分析实验

实验一、词法分析实验

专业:商软二班   姓名:陈广鹏  学号:201506110167

一、        实验目的

 

     编制一个词法分析程序。

 

二、        实验内容和要求

a)        输入:源程序字符串

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

c)         要求:对字符串表示的源程序 

从左到右进行扫描和分解

根据词法规则

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

以供语法分析之用

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

 

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

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名CC.c
  2. 2.      原理分析及流程图

  #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);   

    return 0;//getch();   

 }   

   

void scaner()   

{     

    sum=0;   

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

        token[m]=0;   

        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. 3.      主要程序段及其解释:

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

    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++)    //将识别出来的字符和已定义的标示符作比较

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

     {    

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

        {   

            sum=sum*10+ch-'0'; //将字符串转换成数字  

            ch=prog[p++];   

        }   

        p--;   

        syn=11;数字种别码为11

  1. 4.      运行结果及分析

 

 

此结果符合预期。但是却不够完善,只实现了简单的数字和字母的词法分析。

 

四、        实验总结

 

  心得体会:词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,

初次做词法分析时无从下手,后经过看书查资料对其慢慢理解, 勉强是做出了一个不太好的成品 ,

对于编译程序的学习,我会更加用心的,毕竟我觉得确实有难度,但它确实很有用,比如编译程序

的结构要如何简洁清晰条理化,编译程序的效率等等的实际问题。

 

 

 

posted @ 2016-10-14 14:58  201506110167陈广鹏  阅读(274)  评论(3编辑  收藏  举报