词法分析实验报告

一、        实验目的

     编制一个词法分析程序。

二、        实验内容和要求

     输入:源程序字符串

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

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

    1.      源程序名:词法分析.c

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

    2.      原理分析及流程图

  

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

      

 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000
int j=1;
long g=0;
char nchar[Max]={""}; 
int k=0;
char ch=NULL;
char m[30]={""};
int sym=-1;
main()
{
    char cha;
    int p;
    printf("请输入一串字符串:");
    while((cha=getchar())!='$')
    {
        nchar[g]=cha;
        g++;
    } 
    do
    {
        p=getsym();
    }while(p); 
}
int getsym()
{
    int i;
    char a[2]={""};
    char word[][15]={"begin","do","end","if","then","while"};
    int wsym[6]={1,2,3,4,5,6};
    int ssym[9]={25,26,27,28,0,13,14,15,16};
    char b[9]={'=',';','(',')','#','+','-','*','/'};
    if(j==1&&k<g)
    {
        ch=nchar[k];
        j++;
        k++;
    }
    while(ch==' '||ch==10||ch==9||ch==13)  //判断是否为无用字符
    {
        if(k==g)
        {
            return 0;
        }
        ch=nchar[k];
        k++;
    }
    if(ch>='a'&&ch<='z')      
    {
        while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_')
        {
            a[0]=ch;
            strcat(m,a);
            if(k==g)
            {
                break;
            }
            ch=nchar[k];
            k++;
        }
        for(i=0;i<12;i++)
        {
            if(strcmp(m,&word[i][0])==0)
                break;
        }
        if(i<12)                            //判断是否为保留字
        {
            sym=wsym[i]; 
            printf("保留字%s  种别码%d
",m,wsym[i]);
        }
        Else                           //判断是否为标识符
        {
            sym=10;
            printf("标识符%s  种别码10
",m); 
        }
        if(k==g)
        return 0;
        strcpy(m,"");
        return 1;
    }
    else if(ch>='0'&&ch<='9')
    {
        while(ch>='0'&&ch<='9')     //判断是否为数字
        {
            a[0]=ch;
            strcat(m,a);
            if(k==g)
            {
                break;
            }
            ch=nchar[k];
            k++;
        }
        sym=11; 
        printf("常数%s   种别码11
",m);
        if(k==g)                   //判断是否为运算符
        return 0;
        strcpy(m,"");
        return 1;
    }
    else if(ch==':')
    {
        a[0]=ch;
        strcat(m,a);
        if(k==g)
        {
            sym=17; 
            printf("运算符%s  种别码17
",m);
            return 0;
        } 
        ch=nchar[k];
        k++;
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=18;
            printf("运算符%s  种别码18
",m);
            if(k==g)
            {
                return 0; 
            }
            ch=nchar[k];
            k++;
        }
        strcpy(m,"");
        return 1;
    }
    else if(ch=='<')
    {
        a[0]=ch;
        strcat(m,a);
        if(k<g)
        {
            ch=nchar[k];
            k++;
         } 
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=21;
            printf("运算符%s   种别码21
",m);
            if(k==g)
            {
                return 0; 
            }
            ch=nchar[k];
            k++;
        }
        else if(ch=='>')
        {
            a[0]=ch;
            strcat(m,a);
            sym=22;
            printf("运算符%s   种别码22
",m);
            if(k==g)
            {
                return 0; 
            }
            ch=nchar[k];
            k++;
        }
        else
        {
            printf("运算符%s   种别码22
",m);
        }
        if(k==g)
        {
            return 0;
         } 
        strcpy(m,"");
        return 1;
    }
    else if(ch=='>')
    {
        a[0]=ch;
        strcat(m,a);
        if(k<g)
        {
            ch=nchar[k];
            k++;
         } 
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=24;
            printf("运算符%s   种别码24
",m);
            if(k==g)
            {
                return 0; 
            }
            ch=nchar[k];
            k++;
        }
        else
        {
            sym=23;
            printf("运算符%s   种别码23
",m);
        }
        if(k==g)
        {
            return 0; 
        }
        strcpy(m,"");
        return 1;
    }
    else
    {
        for(i=0;i<9;i++)
        {
            if(ch==b[i])
                break;
        }
        if(i<9)
        {
            sym=ssym[i];
            a[0]=ch;
            strcat(m,a); 
            sym=ssym[i]; 
            printf("%s   种别码为:%d
",m,ssym[i]);
        }
        else
        {
            a[0]=ch;
            strcat(m,a); 
            sym=-1;
            printf("错误!%s不存在种别码
",m);
        }
        if(k<g)
        {
            ch=nchar[k];
            k++;
        }
        else
           {
            return 0;
        }
        strcpy(m,"");
        return 1;
    }
}
 

          4.      运行结果及分析

    

      

四、        实验总结

通过这个实验,使我了解了编译器词法分析的过程。虽然在干开始做着个程序是是很茫然的,但是在经过一段时间的思考,有了感觉和眉目就开始左手写词法分析程序,这个也算是第二版本吧,第一个版本有个问题就是不能呢个让它在用户输入完后再执行分析,而是用户一换行就执行一段并输出结果,然后在让用户输入,这样做感觉不是很满意就对输入进行了改进,这只是一个功能简化的程序,如果以后要增加功能在这个基础上改就好了。

原文地址:https://www.cnblogs.com/zd983886992/p/6030348.html