zoukankan      html  css  js  c++  java
  • 词法分析(改)

    #include<stdio.h>
    #include<string.h>
    int i,s=1;
    
    //判断是否数字
    void number(char a[])
    {
        char b[100];
        int m,k=0,t;
        m=i;
        while(a[m]>='0' && a[m]<='9')  
        {
            b[k]=a[m];   //用数组b存放数组a中的数字
            k++;
            m++;
        }
        i=m-1;
        printf("(11,");
        for(t=0;t<k;t++)
            printf("%c",b[t]);
        printf(")
    ");
    }
    
    //检索关键字表格
    void keyword(char a[])
    {
        int k=0,m,flag=0,t;
        char b[100];
        char *key[6]={"begin","if","then","while","do","end"};
        m=i;
        while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
        {
            b[k]=a[m];   
            k++;
            m++;
            b[k]='';
        }
        i=m-1;
        for(t=0;t<6;t++)
        {
            if(strcmp(b,key[t])==0)  //将数组b与关键字进行比较
            {
                printf("(%d,%s)
    ",t+1,key[t]);  //输出关键字
                flag=1;
            }
        }
        if(flag==0)
        {
            printf("(10,%s)
    ",b);   //输出标识符
        }
    }
    
    //词法扫描函数
    void Fenxi(char ch,char b)
    {  
         switch(ch)
         {
            case '=':
                printf("(25,=)
    ");break;
            case '+':
                printf("(13,+)
    ");break;
            case '-':
                printf("(14,-)
    ");break;
            case '*':
                printf("(15,*)
    ");break;
            case '/':
                printf("(16,/)
    ");break;
            case'(':
                printf("(27,()
    ");break;
            case')':
                printf("(28,))
    ");break;
            case ',':
                printf("(32,,)
    ");break;
            case ';':
                printf("(34,;)
    ");break;
            case ':':
                if(b=='=')
                {
                    i++;
                    printf("(18,:=)
    ");
                }
                else
                    printf("(17,:)
    ");
                break;
            case '<':
                if(b=='>')
                {
                    i++;
                    printf("(21,<>)
    ");
                }
                else if(b=='=')
                {
                    i++;
                    printf("(22,<=)
    ");
                }
                else
                    printf("(20,<)
    ");
                break;
            case '>':
                if(b=='=')
                {
                    printf("(24,>=)
    ");
                    i++;
                }
                else
                    printf("(23,>)
    ");
                break;
            default:
                s=0;
                break;
        }
    }
    
    main()
    {
        char p;
        char a[100];
        printf("请输入源程序(以#结束):
    ");
        for(i=0;i<100;i++)
        {
            scanf("%c",&p);
            a[i]=p;
            if(p=='#')
                break;
        }
        printf("
    分析结果为:
    ");
        i=0;
        while(i<100&&a[i]!='#')
        {
            if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))   
                keyword(a);
            else if(a[i]>=48&&a[i]<=57)
                number(a);
            else
                Fenxi(a[i],a[i+1]);
            i++;
        }
        if(a[i]=='#')
            printf("(0,#)");
        printf("
    ");
    }

  • 相关阅读:
    Linux(centos)系统各个目录的作用详解
    java.util.ConcurrentModificationException异常处理
    欧几里得算法
    Google数据中心B4网络具体实现
    网络虚拟化
    SDN/NFV若干问题
    opendaylight的Beryllium安装
    解读SDN的东西、南北向接口
    SFC中的故障管理
    SFC中的问题描述
  • 原文地址:https://www.cnblogs.com/blueYE00/p/4867737.html
Copyright © 2011-2022 走看看