码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析实验报告

时间:2016-10-14 17:21:29      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

实验一、词法分析实验

商业软件工程  符致伟  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字符串数组中就能跟种别码一起输出了。

 

词法分析实验报告

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!