词法分析实验报告 157

实验一、词法分析实验

商业软件工程  符致伟  201506110157

一、        实验目的

 编制一个词法分析程序

二、        实验内容和要求

 输入:源程序字符串

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

 待分析语言的词法规则

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

原理分析及流程:

主要程序段及其解释:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
char sum[MAX],ch,token[MAX];//字符串储存,单个字符,字符提取
int a=0,zbm,n,i;//计数器,种别码
char *gjz[6]={"begin","if","then","while","do","end"};

void FX();

void main()
{
    printf("请输入字符串,以#结束:");
    do
    {
        ch=getchar();
        sum[a++]=ch;
    }while(ch!='#');
    a=0;
    do
    {
        FX();
        printf("%d\t%s\n",zbm,token);

    }while(zbm!=0);//直到最后一个为#
    getchar();
}

void FX()
{
    for(n=0;n<MAX;n++)
    {token[n]='\0';}
    n=0;
    ch=sum[a++];
    while(ch==' '){ch=sum[a++];}

    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')||(ch>='0'&&ch<='9'));
        zbm=11;

        for(n=0;n<6;n++)//关键字
        {
            if(strcmp(token,gjz[n])==0)
        {
            zbm=n+1;
        }
        }
        a--;

    }
    else if(ch>='0'&&ch<='9')//纯数字
    {
        a--;
        do
        {
            token[n++]=sum[a++];
            ch=sum[a];
        }while(ch>='0'&&ch<='9');
        zbm=11;
        return;
    }
    else
    {
        switch(ch)
        {
        case '+':zbm=13;token[0]=ch;break;
        case '-':zbm=14;token[0]=ch;break;
        case '*':zbm=15;token[0]=ch;break;
        case '/':zbm=16;token[0]=ch;break;
        case ':':zbm=17;token[0]=ch;ch=sum[a++];
            if(ch=='='){
            token[1]=ch;
            zbm++;
            }
            else a--;
            break;
        case '<':zbm=20;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=23;token[0]=ch;ch=sum[a++];
            if(ch=='='){
                        token[1]=ch;
                        zbm++;
            }
            else a--;
            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;break;
        case '#':zbm=0;token[0]=ch;break;
        default:break;
        }
    }
}

运行结果及分析:

四、        实验总结

    关键字的对比用过数组,在strcmp的比较中出现了问题,参考网上其他人写的,改用指针类型,字符串的存储一开始用scanf一次性存到一个字符串里,但读出来分析麻烦,改用getchar一个个字符存,这样后面字符拼起来分析,存到token字符串数组中就能跟种别码一起输出了。

原文地址:https://www.cnblogs.com/FZW1874402927/p/5960650.html