zoukankan      html  css  js  c++  java
  • 词法分析实验报告 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字符串数组中就能跟种别码一起输出了。

  • 相关阅读:
    $Poj2228$/洛谷$SP283 Naptime$ 环形$DP$
    $Poj1952 $洛谷$1687 Buy Low,Buy Lower$ 线性$DP+$方案计数
    $Poj3585 Accumulation Degree$ 树形$DP/$二次扫描与换根法
    洛谷$1541$ 乌龟棋 线性$DP$
    $Loj10157$ 皇宫看守 树形$DP$
    $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
    $Loj10155$ 数字转换(求树的最长链) 树形$DP$
    洛谷$2015$二叉苹果树
    $CH5302$ 金字塔 区间$DP$/计数类$DP$
    [hiho1035] 自驾旅行III
  • 原文地址:https://www.cnblogs.com/FZW1874402927/p/5960650.html
Copyright © 2011-2022 走看看