词法分析实验报告

实验一、词法分析实验

专业:商业软件工程专业   姓名:叶胜轩  学号:201506110125

一、        实验目的

(1)    理解词法分析在编译程序中的作用。

(2)    加深对有穷自动机模型的理解。

(3)    掌握词法分析程序的实现方法。

(4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

二、        实验内容和要求

1,待分析的简单语言的词法。

2,各种单词符号对应的种别码。

3,词法分析程序的功能(输入,输出)。

 

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

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

可执行程序名:1.exe

2.      原理分析及流程图

主要总体设计问题。

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

词法分析主程序示意图

 

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

#include <stdio.h>                 
#include <string.h>               
#include <conio.h>                
#include <ctype.h>                 
char prog[80]={'\0'},token[8];                    
char ch;
int syn,n,sum,m,p;                         
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))   
    {
        while(isalpha(ch)||isdigit(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))    
        {
            while(isdigit(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.      运行结果及分析

四、实验总结

词法分析让我知道我还有很多不会的地方,甚至需要上网查找和问同学,还需认真努力学习。

原文地址:https://www.cnblogs.com/TopHin/p/5961317.html