• 编译原理(第三版)词法分析器


    /*
        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);
        }
    }
  • 相关阅读:
    chrome 插件备份
    github下载单个文件
    idea插件备份
    外卖类应用的竞争与趋势
    使用终端和Java API对hbase进行增删改查操作
    分布式文件系统的布局、文件查找
    Java上机实验报告(4)
    Java上机实验报告(3)
    Java上机实验报告(2)
    Java上机实验报告(1)
  • 原文地址:https://www.cnblogs.com/--lr/p/10773428.html
Copyright © 2020-2023  润新知