zoukankan      html  css  js  c++  java
  • 0909 初识编译原理

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define _KEY_WOED_END "waiting for your expanding"     //关键字结束标志
    
    typedef struct
    {
        int typenum;
        char * word;
    }WORD;
    
    char input[255];   //输入换缓冲区 
    
    char token[255]="";   //单词缓冲区
    
    int p_input;        //输入换缓冲区指针
    
    int p_token;        //单词缓冲区指针
    
    char ch;           //当前所读的字符
    
    char *rwtab[]={"begin","if","then","while","do","end",_KEY_WOED_END};        //C语言关键字
    
    WORD * scaner();    //词法扫描函数,获得关键字
    
    
    
    
    
    
    main()
    {
        int over=1;
        WORD *oneword;
        oneword=(WORD *)malloc(sizeof(WORD));
        printf("请输入您的字符串(以#作为结束标志):");
        scanf("%[^#]s",input);                        
        p_input=0;
        printf("您输入的字符串是:%s
    
    ",input);
        while(over<1000&&over!=-1)
        {
            oneword=scaner();
            printf("(%d,%s)
    ",oneword->typenum,oneword->word);
            over=oneword->typenum;
        }
        
    }
    
    
    //需要用到的自编函数参考实现
    //从输入缓冲区读取一个字符到ch中
    
    char m_getch(){
        ch=input[p_input];
        p_input=p_input+1;
        return (ch);
    }
    
    
    
    //去掉空白字符
    void getbc()
    {
        while(ch==' '||ch==10){
        ch=input[p_input];
        p_input=p_input+1;
        }
    }
    
    
    
    //拼接单词
    void concat()
    {
        token[p_token]=ch;
        p_token=p_token+1;
        token[p_token]='';
    }
    
    
    
    //判断是否字母
    int letter()
    {
        if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return 1;
        else return 0;
    }
    
    
    //判断是否数字
    int digit()
    {
        if(ch>='0'&&ch<='9')
            return 1;
        else
            return 0;
    }
    
    
    //检索关键字表格
    int reserve()
    {
        int i=0;
        for(i=0;i<7;i++)
        {
            if(!strcmp(rwtab[i],token))
            {
                return i+1;
            }
            i=i+1;
        }
        return 10;
    }
    
    
    
    
    //回退一个字符
    void retract()
    {
        p_input=p_input-1;
    }
    
    
    
    
    WORD *scaner()
    {
        WORD *myword;
        myword=(WORD *)malloc(sizeof(WORD));
        myword->typenum=10;
        myword->word="";
        p_token=0;
        m_getch();
        getbc();
        if(letter())
        {
            while(letter()||digit())
            {
               concat();
               m_getch();
            
            }
            retract();
             myword->typenum=reserve();
            myword->word=token;
            return(myword);
        }
        else if(digit())
        {
            while(digit())
            {
                concat();
                m_getch();
            }
            retract();
            myword->typenum=20;
            myword->word=token;
            return(myword);
        }
        else
        {
            switch(ch)
            {
            case '=':m_getch();
                if(ch=='=')
                {
                    myword->typenum=39;
                    myword->word="==";
                    return(myword);
                }
                retract();
                myword->typenum=21;
                myword->word="=";
                return(myword);
                break;
            case '+':
                myword->typenum=22;
                    myword->word="+";
                    return(myword);
                    break;
            case '-':
                myword->typenum=23;
                    myword->word="-";
                    return(myword);
                    break;
            case '*':
                myword->typenum=24;
                myword->word="*";
                return(myword);
                break;
            case '/':
                myword->typenum=25;
                myword->word="/";
                return(myword);
                break;
            case '(':
                myword->typenum=26;
                myword->word="(";
                return(myword);
                break;
            case ')':
                myword->typenum=27;
                myword->word=")";
                return(myword);
                break;
            case '[':
                myword->typenum=28;
                myword->word="[";
                return(myword);
                break;
            case ']':
                myword->typenum=29;
                myword->word="]";
                return(myword);
                break;
            case '{':
                myword->typenum=30;
                myword->word="{";
                return(myword);
                break;
            case '}':
                myword->typenum=31;
                myword->word="}";
                return(myword);
                break;
            case ',':
                myword->typenum=32;
                myword->word=",";
                return(myword);
                break;
            case ':':
                myword->typenum=33;
                myword->word=":";
                return(myword);
                break;
            case ';':
                myword->typenum=34;
                myword->word=";";
                return(myword);
                break;
            case '>':
                myword->typenum=35;
                myword->word=">";
                return(myword);
                break;
            case '<':
                myword->typenum=36;
                myword->word="<";
                return(myword);
                break;
            case '!':
                m_getch();
                if(ch=='=')
                {
                    myword->typenum=40;
                    myword->word="!=";
                    return(myword);
                }
                retract();
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
                break;
            case '':
                myword->typenum=1000;
                myword->word="OVER";
                return(myword);
                break;
            default:
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
                }
            }
        }
  • 相关阅读:
    解决 Windows Server 2008 R2 上 Windows Update 无法失败,提示 8024402F
    【UWP】实现 FindAncestor 绑定
    实现在 .net 中使用 HttpClient 下载文件时显示进度
    【UWP】手动实现 WebAuthenticationBroker
    记录使用 Cake 进行构建并制作 nuget 包
    w筛选系数=(1+错次)/(1+总次)
    WZP身份溯源策略(World Zero Protection),宜分宜合、自主可控的实名认证体系
    WZP报文封装协议(Web Zip Protocol),安全可嵌套的传输协议
    WZP安全配置方案,针对通讯技术的安全措施
    WZP网络结构模型,对OSI参考模型和TCP/IP模型的改进
  • 原文地址:https://www.cnblogs.com/chenkaiqi/p/4826920.html
Copyright © 2011-2022 走看看