• 词法分析


    #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\n\n",input);
        while(over<1000&&over!=-1)
        {
            oneword=scaner();
            printf("(%d,%s)\n",oneword->typenum,oneword->word);
            over=oneword->typenum;
        }
        printf("\n\n备注:数字10代表所输入的不是关键词,只是普通词\n");
        printf("     数字20代表您输入的是数字\n");
        printf("     数字1000是结束标志\n\n");
     
    }
     
    //需要用到的自编函数参考实现
    //从输入缓冲区读取一个字符到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]='\0';
    }
     
     
     
    //判断是否字母
    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 '\0':
                myword->typenum=1000;
                myword->word="OVER";
                return(myword);
                break;
            default:
                myword->typenum=-1;
                myword->word="ERROR";
                return(myword);
                }
            }
        }
    
    
  • 相关阅读:
    【Cocos2d-X游戏实战开发】捕鱼达人之游戏场景的创建(六)
    WPF-24:绘制正多边形
    长假引起的系统审批流的变更的思考
    Linux shell编程02 shell程序的执行 及文件权限
    poj2787 算24
    REVERSE关键字之REVERSE索引
    设计模式读书笔记-----备忘录模式
    乔布斯的基本原则 (斯卡利访谈录 )
    MediaInfo源代码分析 1:整体结构
    Python 入门教程 9 ---- A Day at the Supermarket
  • 原文地址:https://www.cnblogs.com/BOBOWZH/p/5942830.html
Copyright © 2020-2023  润新知