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

    样例输入:if num > 100 then num2 = 100 else num2 = 0 ; #

    样例输出:

    #include "cstdio"
    #include "cstring"
    #include "cctype"
    
    const int ERROR = -1 ;
    const int OVER = 0 ;
    
    const int BEGIN = 1;
    const int END = 2;
    const int IF = 3;
    const int THEN = 4;
    const int WHILE = 5;
    const int DO = 6;
    const int CONST = 7;
    const int VAR = 8;
    const int CALL = 9 ;
    const int PROCEDURE = 10;
    
    const int ID = 11;
    const int NUMBER = 12;
    
    const int PLUS = 13;
    const int SUB =14;
    const int STAR = 15;
    const int DIV = 16;
    const int MOD = 17;
    const int EQUAL = 18;//=
    const int NE =19;//<>
    const int LESS = 20;//<
    const int MORE = 21;//>
    const int LE = 22;//<=
    const int ME = 23;//>=
    const int ASSIGN = 24;//:=
    const int LPAR = 25;//(
    const int RPAR = 26;//)
    const int COMMA = 27;//,
    const int DOT = 28;//.
    const int SEMICOLON = 29;//;
    
    char buffer[200]= {''};
    char str[20];//存放构成单词符号的字符串*/
    char ch;
    
    int n;
    int number;  //存放常量(整数)
    int pstr,pbuffer;    
    
    //关键字
    int keyWordNum=10; //关键字
    char keywords [10][10] = {"begin","end","if","then","while","do","const","var","call","procedure"};
    
    //常数表
    int numOfNumbers=0;
    int numtab[100];
    
    //变量表
    int numOfVars=0;
    char vartab[100][10];
    
    //读取非空字符
    void getBC()
    {
        ch=buffer[pbuffer++];
        while(ch==' ')ch=buffer[pbuffer++];
    }
    
    //回退一个字符
    void retract()
    {
        ch=buffer[pbuffer--];
    }
    
    //对缓冲区的内容进行扫描
    int scan()
    {
        //初始化字符串
        pstr=0;
        for(int i=0; i<20; ++i)
        {
            str[i]='';
        }
    
        //初始化数字常量
        number=0;
    
        getBC();
    
        if( isalpha(ch) )
        {
            //读取标识符
            while( isalpha(ch) || isdigit(ch) )
            {
                str[pstr++]=ch;
                ch = buffer[pbuffer++];
            }
            str[pstr++]='';
            int syn=11;
    
            retract();//回退
    
            //判断是否是关键字
            for(int i=0; i<keyWordNum; ++i)
            {
                if(strcmp(str,keywords[i])==0)    //字符串的比较
                {
                    syn=i+1;
                    break;
                }
            }
            return syn;
        }
        else if( isdigit(ch) )
        {
            while( isdigit(ch) )
            {
                number = number*10 + ch-'0';
                ch = buffer[pbuffer++];
            }
            retract();//回退
            return NUMBER;
        }
        else
        {
            switch(ch)
            {
            case'+':
                //syn=13;
                str[0]=ch;
                return PLUS;
            case'-':
                //syn=14;
                str[0]=ch;
                return SUB;
            case'*':
                //syn=15;
                str[0]=ch;
                return STAR;
            case'/':
                //syn=16;
                str[0]=ch;
                return DIV;
            case'%':
                str[0]=ch;
                return MOD;
            case'=':
                str[0]=ch;
                return EQUAL;
            case'<':
                pstr=0;
                str[pstr++]=ch;
                ch=buffer[pbuffer++];
                if(ch=='>')
                {
                    str[pstr++]=ch;
                    return NE;
                }
                else if(ch=='=')
                {
    
                    str[pstr++]=ch;
                    return LE;
                }
                else
                {
                    retract();
                    return LESS;
                }
                break;
            case'>':
                pstr=0;
                str[pstr++]=ch;
                ch=buffer[pbuffer++];
                if(ch=='=')
                {
                    str[pstr++]=ch;
                    return ME;
                }
                else
                {
                    retract();
                    return MORE;
                }
                break;
            case':':
                pstr=0;
                str[pstr++]=ch;
                ch=buffer[pbuffer++];
                if(ch=='=')
                {
                    str[pstr++]=ch;
                    return ASSIGN;
                }
                else
                {
                    retract();
                    return ERROR;
                }
                break;
            case'(':
                str[0]=ch;
                return LPAR;
            case')':
                str[0]=ch;
                return RPAR;
            case',':
                str[0]=ch;
                return COMMA;
            case'.':
                str[0]=ch;
                return DOT;
            case';':
                str[0]=ch;
                return SEMICOLON;
            case'#':
                str[0]=ch;
                return OVER;
            default:
                return ERROR;
            }
        }
    
    
    }
    
    //插入变量,返回在变量表的位置
    int insert_Var(const char * str)
    {
        for(int i=0; i<numOfVars; i++)
        {
            if(strcmp(str,vartab[i])==0)    //字符串的比较
            {
                return i+1;
            }
        }
        strcpy(vartab[numOfVars++],str);
        return numOfVars;
    }
    
    //插入整数常量,返回位置
    int insert_Num(int number)
    {
        for(int i=0; i<numOfNumbers; i++)
        {
            if(numtab[i]==number)    //字符串的比较
            {
                return i+1;
            }
        }
        numtab[numOfNumbers++]=number;
        return numOfNumbers;
    }
    
    
    main()
    {
        freopen("in.txt","r",stdin);//从文件读入数据
    
        printf("
    
    The explanation :
    "
               "1. 1 to 10 : Keyword
    "
               "2. 11 : Other indicators by user
    "
               "3. 12 : Numbers
    "
               "4. 13 to 29 : Operators
    ");
    
    
        printf("
    Please input string:
    ");
    
        //输入到缓冲区
        pbuffer=0;
        do
        {
            ch=getchar();
            buffer[pbuffer++]=ch;
        }
        while(ch!='#');
    
        //词法分析
        pbuffer=0;
        int loc,syn;
        do
        {
            syn = scan();
            switch(syn)
            {
            case -1:
                printf(" ERROR
    ");
                break;
            case 12:
                //常数
                loc = insert_Num(number);
                printf("( %2d,%2d ) %d
    ",syn,loc,number);
                break;
            case 11:
                //用户变量
                loc = insert_Var(str);
                printf("( %2d,%2d ) %s
    ",syn,loc,str);
                break;
            default:
                //关键字
                printf("( %2d, - ) %s
    ",syn,str);
            }
        }
        while(syn!=0);
    
        return 0;
    }
    

      

  • 相关阅读:
    20200929-git地址
    20200917-1 每周例行报告
    20200917-2 词频统计
    20200917-3 白名单
    20200910-1 每周例行报告
    20200910-2 博客作业
    20200924-3 单元测试,结对
    20200924-2 功能测试
    20200924-5 四则运算试题生成,结对
    20200924-4 代码规范,结对要求
  • 原文地址:https://www.cnblogs.com/bruce27/p/5382069.html
Copyright © 2011-2022 走看看