词法分析实验报告

实验一、词法分析实验

专业:商业软件工程  姓名:陈颖楠 学号:201506110104

一、实验目的

 编制一个词法分析程序

二、实验内容和要求

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

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

1. 源程序名:压缩包文件(rarzip)中源程序名词法分析.c

可执行程序名:词法分析.exe

2.  原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

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

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

char prog[80]={'\0'},
     token[8];                     /*存放构成单词符号的字符串*/
char ch;
int syn,;                          /*存放单词字符的种别码*/
int n,sum,m,p;            /*存放整数型单词*    /*p是缓冲区prog的指针,m是token的指针*/
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
        token[n]='\0';
    ch=prog[p++];
    while(ch==' ')
        ch=prog[p++];
    if(isalpha(ch))    /*ch为字母字符*/{
        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/{
           token[m++]=ch;
           ch=prog[p++];}
        token[m++]='\0';
        ch=prog[p--];
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/{
                syn=n+1;
                break;}}
    else
        if(isdigit(ch))    /*ch是数字字符*/{
            while(isdigit(ch))    /*ch是数字字符*/{
                sum=sum*10+ch-'0';
                ch=prog[p++];}
            ch=prog[p--];
            syn=11;}
        else
            switch(ch){
                case'<':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='>'){
                            syn=21;
                            token[m++]=ch;}
                        else if(ch=='='){
                            syn=22;
                            token[m++]=ch;}
                            else{
                                 syn=20;
                                 ch=prog[p--];}
                        break;
                case'>':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='='){
                            syn=24;
                            token[m++]=ch;}
                        else{
                            syn=23;
                            ch=prog[p--];}
                        break;
             case':':m=0;token[m++]=ch;ch=prog[p++];
                     if(ch=='='){
                         syn=18;
                         token[m++]=ch;}
                     else{
                         syn=17;
                         ch=prog[p--];}
                     break;
             case'+':syn=13;token[0]=ch;break;
             case'-':syn=14;token[0]=ch;break;
             case'*':syn=15;token[0]=ch;break;
             case'/':syn=16;token[0]=ch;break;
             case'=':syn=25;token[0]=ch;break;
             case';':syn=26;token[0]=ch;break;
             case'(':syn=27;token[0]=ch;break;
             case')':syn=28;token[0]=ch;break;
             case'#':syn=0;token[0]=ch;break;
             default:syn=-1;}}
main()
{ 
    p=0;
    printf("\n请输入需要分析的字符串,以#表示结束:");
    do 
    {
           ch=getchar();
           prog[p++]=ch;
     }while(ch!='#');
   p=0;
   do
   {
        scaner();
        switch(syn)
        {
            case 11: printf("(%d,%d)\n",syn,sum);break;
            case -1: printf("\n 出错;\n");break;
            default: printf("(%d,%s)\n",syn,token);
        }
    }while(syn!=0);
    getch();
}

4.  运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   

五、实验总结

心得体会:这次实验花了很久的时间,有很多地方都要问别人和上网找,做出来之后觉得很有成就感。

实验过程的难点问题:输入字符串后要逐个提取出来然后用if语句判断字符的种别码很复杂,经常会写错。

 

 

posted @ 2016-10-14 16:59  104陈颖楠  阅读(329)  评论(4编辑  收藏  举报