zoukankan      html  css  js  c++  java
  • 编译原理(第三版)词法分析器

    /*
        begin x:=9; if x > 0 then x:= 2*x+1/3; end #
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define _KEY_WORD_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_WORD_END};
    WORD * scaner();
    
    int main()
    {
        int over = 1;
        WORD* oneword = new WORD;
        printf("Enter Your words(end with #):");
        scanf("%[^#]s",input);
        p_input = 0;
        printf("Your words:
    %s
    ",input);
        while(over < 1000 &&over !=-1)
        {
            oneword = scaner();
            if(oneword->typenum <1000)
                printf("(%d,%s)
    ",oneword->typenum,oneword->word);
            over = oneword->typenum;
        }
        printf("
    press # to exit:");
        scanf("%[^#]s",input);
        return 0;
    }
    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++;
        }
    }
    void concat()
    {
        token[p_token] = ch;
        p_token++;
        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;
        while(strcmp(rwtab[i],_KEY_WORD_END))
        {
            if(!strcmp(rwtab[i],token))
                return i+1;
            i++;
        }
        return 10;
    }
    void retract()
    {
        p_input--;
    }
    
    char* dtb()
    {
        return NULL;
    }
    
    WORD* scaner()
    {
    
        WORD* myword = new 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 = 11;
            myword->word = token;
            return(myword);
        }
        else switch(ch)
        {
            case'=':m_getch();
                if(ch == '=')
                {
                    myword->typenum = 25;
                    myword->word = "==";
                    return(myword);
                }
                retract();
                myword->typenum = 21;
                myword->word = "=";
                return(myword);
                break;
            case'+':
                myword->typenum = 13;
                myword->word = "+";
                return(myword);
                break;
            case'-':
                myword->typenum = 14;
                myword->word = "-";
                return(myword);
                break;
            case'*':
                myword->typenum = 15;
                myword->word = "*";
                return(myword);
                break;
            case'/':
                myword->typenum = 16;
                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 = 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':':m_getch();
                if(ch == '=')
                {
                    myword->typenum = 18;
                    myword->word = ":=";
                    return(myword);
                }
                retract();
                myword->typenum = 17;
                myword->word = ":";
                return(myword);
                break;
            case';':
                myword->typenum = 26;
                myword->word = ";";
                return(myword);
                break;
            case'>':m_getch();
                if(ch == '=')
                {
                    myword->typenum = 24;
                    myword->word = ">=";
                    return(myword);
                }
                retract();
                myword->typenum = 23;
                myword->word = ">";
                return(myword);
                break;
            case'<':m_getch();
                if(ch == '=')
                {
                    myword->typenum = 22;
                    myword->word = "<=";
                    return(myword);
                }
                else if(ch == '>')
                {
                    myword->typenum = 21;
                    myword->word = "<>";
                    return(myword);
                }
                retract();
                myword->typenum = 20;
                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 = 0;
                myword->word = "#";
                return(myword);
                break;
            case'':
                myword->typenum = 1000;
                myword->word = "OVER";
                return(myword);
                break;
            default: myword->typenum = -1;
                myword->word = "ERROR";
                return(myword);
        }
    }
  • 相关阅读:
    Windows2012下安装和配置Oracle BIEE12c
    Windows Oracle 12安装教程
    SpringCloud学习之Ribbon使用(四)
    SpringCloud学习之手把手教你用IDEA搭建入门项目(三)
    SpringCloud学习之手把手教你用IDEA搭建入门项目(二)
    SpringCloud学习之手把手教你用IDEA搭建入门项目(一)
    SpringCloud学习之手把手教你用IDEA搭建入门项目【番外篇】(一)
    SpringCloud学习之大纲总略(大纲篇)
    Websocket @serverendpoint 404
    XMLHttpRequest status为0
  • 原文地址:https://www.cnblogs.com/--lr/p/10773428.html
Copyright © 2011-2022 走看看