⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 varproc.cpp

📁 一个小型C语言编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    CurVarRec->child = NULL;
    return 0;
}

static int Define_check_finish()
{
    return 0;
}


/*
FOR 状态转移图
                                                ;                                           )
                                      /---------------------\                     /------------------\
                                      |                     |                     |                  |
                                      |                     |                     |                  |
                 FOR           (      |     EXPRESS + ;     \/    EXPRESS + ;     |    EXPRESS + )   \/
        [START]-------->[S1]------->[S2]------------------>[S3]---------------->[S4]---------------->[F]
                                                            |                    /\
                                                            |                    |
                                                            |         ;          |
                                                            \--------------------/

*/



//int For_check_finish();

//int For_check_finish()
//{
//    return 0;
//}

int For_proc()
{
    return For_check_state1();
}


static int For_check_state1()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(tok == '(')
        return For_check_state2();
    else
        return -1;
}

static int For_check_state2()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(tok == ';')
        return For_check_state3();
    else if(Expr_proc(tok)==';')
        return For_check_state3();
    else
        return -1;    
}

static int For_check_state3()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(tok == ';')
        return For_check_state4();
    else if(Expr_proc(tok)==';')
        return For_check_state4();
    else    
        return -1;
}

static int For_check_state4()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    } else if (tok == ')') {
        return 0;//return For_check_finish();
    } else if (tok == ID) {
        if (Expr_proc(tok) == ')') {
            return 0;
        } else {
            return -1;
        }
    } else {
        return -1;
    }
    

    //if(Expr_proc(tok)==')')
    //    return 0;//return For_check_finish();
    //else    
    //    return -1;
}



/*
IF 状态转意图
                       IF               (            EXPRESS + )
             [START]---------->[S1]----------->[S2]-------------->[F]
                                                |                  /\
                                                |                  |
                                                |         )        |
                                                \------------------/
*/

//int If_check_finish()
//{
//    return 0;
//}

int If_proc()
{
    return If_check_state1();
}

static int If_check_state1()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(tok == '(')
        return If_check_state2();
    else
        return -1;
}

static int If_check_state2()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(Expr_proc(tok) == ')')
        return 0;  //return If_check_finish();
    else
        return -1;
}



/*
while 状态转移图

                       WHILE            (            EXPRESS + )
             [START]---------->[S1]----------->[S2]--------------->[F]
                                                |                   /\
                                                |                   |
                                                |         )         |
                                                \-------------------/
*/


int While_proc()
{
    return While_check_state1();
}



static int While_check_state1()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    }

    if(tok == '(')
        return While_check_state2();
    else
        return -1;
}

static int While_check_state2()
{
    int tok = -1;

    tok = gettok();
    if(tok == EOI) {
        return -5;//end of file
    } else if (tok == ID) {
        if(Expr_proc(tok) == ')')
            return 0;
        else
            return -1;
    } else {
        return -1;
    }
    
    //if(Expr_proc(tok) == ')')
    //    return 0;
    //else
    //    return -1;
}





/*
    语句状态转移图         
                                            /-----------------------------------------------\
                                            |                                               |
                                            |                                               |
                  ID                ;       \/                                              |
       [START]-------->[  S1  ]--------->[FINISH]<----------------\                         |
                         |   |              /\                    |                         |
                         |   |              | ;                   |                         |
                         |  =|              |                     |                         |
                         |   |           [  S8  ]                 | ;                       |
                       ( |   |             |  /\                  |                         |
                         |   |           OP|  | NUM               |                         |
                         |   |             \/ |        ID         |        OP               |
                         |   \---------->[  S2  ]------------->[  S3  ]-------->[S4]        |
                         |                                       |   /\           |         |
                         \-----------------------------------\   |   |            |         |
                                  ID/NUM                     | ( |   |   ID/NUM   |         |
                            /---------------\                |   |   \------------/         |
                            |               |                |   |                          |
                            |               |                |   |                          |
                            |          ,    \/  ID/NUM       \/  \/      )             ;    |
                          [S7]<------------[S6]<------------[  S5  ]--------->[S8]----------/
                                            |                                  /\
                                            |                                  |
                                            |                 )                |
                                            \----------------------------------/

*/



int Clause_proc()
{
    return Clause_Start();
}


static int Clause_Start()
{
    //开始前保存了上一个tok
    varname = token;
    line_no = lineno;
    return Clause_check_state1();
}

static int Clause_check_state1()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of file
    }

    switch(tok) {
        case ';':
        case '=':
            //变量使用,把变量插入变量表
            {
                VAR_USE_REC temp = {0};
                temp.line = line_no;
                temp.name = varname;
                if (tok == ';') {
                    temp.use_type = REF_STATE;
                } else if (tok == '=') {
                    temp.use_type = ASS_STATE;
                }
                    VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            if (tok == ';') {
                return Clause_check_finish();
            } else if (tok == '='){
                return Clause_check_state2();
            }
        
        case '(':
            //函数调用
            varname = NULL;
            line_no = 0;
            return Clause_check_state5();
            
        default:
            return -1;
    }
}

static int Clause_check_state2()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5; //End of file
    } 

    if (tok == ID) {
        varname = token;
        line_no = lineno; //保存ID名称,因为不确定此ID是变量还是函数名
        return Clause_check_state3();
    } else if (isnum(tok)) {
        return Clause_check_state8();
        //return Clause_check_state3();
    } else {
        return -1;
    }
    /*
    switch(tok)
    {
        case ID:
        
            varname = token;
            line_no = lineno; //保存ID名称,因为不确定此ID是变量还是函数名
            case NUM:
            return Clause_check_state3();

        default:
            return -1;
    }
    */
}

static int Clause_check_state3()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of file
    } else if (isoperator(tok)){
        tok = OPERATOR;
    }
    switch(tok) {
        case ';':
            if(varname) {
                //变量使用,把变量插入变量表
                {
                    VAR_USE_REC temp = {0};
                    temp.line = line_no;
                    temp.name = varname;
                    temp.use_type = REF_STATE;//USE_STATE
                    VarInsert(temp);
                }
                varname = NULL;
                line_no = 0;
            }
            return Clause_check_finish();
            
        case '(':
            //函数调用
            varname = NULL;
            line_no = 0;
            return Clause_check_state5();
            
        case OPERATOR:
            if(varname) {
                //变量使用,把变量插入变量表
                {
                    VAR_USE_REC temp = {0};
                    temp.line = line_no;
                    temp.name = varname;
                    temp.use_type = REF_STATE;//USE_STATE
                    VarInsert(temp);
                }
                varname = NULL;
                line_no = 0;
            }
            return Clause_check_state4();
            
        default:
            return -1;
    }
}

static int Clause_check_state4()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of file
    } else if (isnum(tok)) {
        tok = NUM;
    }


    switch(tok) {
        case ID:
            //保存token,因为当前不确定此ID是变量还是函数名
            varname = token;
            line_no = lineno;
        case NUM:
            return Clause_check_state3();
        default:
            return -1;
    }
}

static int Clause_check_state5()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of  file
    } else if (isnum(tok)) {
        tok = NUM;
    }
    switch(tok) {
        case ')':
            return Clause_check_state8();

        case ID:
            //变量作为函数参数使用,把变量插入变量表
            varname = token;
            line_no = lineno;
            {
                VAR_USE_REC temp = {0};
                temp.line = line_no;
                temp.name = varname;
                temp.use_type = REF_STATE;//USE_STATE;
                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
        case NUM:
            return Clause_check_state6();

        default:
            return -1;
    }
}

static int Clause_check_state6()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5; //end of file
    }

    switch(tok) {
        case ',':
            return Clause_check_state7();
        
        case ')':
            return Clause_check_state8();
            
        default:
            return -1;
    }
}

static int Clause_check_state7()
{
    int tok = -1;

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of file
    } else if (isnum(tok)) {
        tok = NUM;   
    }

    switch(tok) {
        case ID:
            //变量作为函数参数使用,把tok插入变量表
            varname = token;
            line_no = lineno;
            {
                VAR_USE_REC temp = {0};
                temp.line = line_no;
                temp.name = varname;
                temp.use_type = REF_STATE;//USE_STATE;
                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
        case NUM:
            return Clause_check_state6();

        default:
            return -1;
    }
}

static int Clause_check_state8()
{
    int tok = -1; 

    tok = gettok();
    if (tok == EOI) {
        return -5;//end of file
    } else if (isoperator(tok)) {
        tok = OPERATOR;
    }

    switch(tok)
    {
        case ';':
            return Clause_check_finish();
        case OPERATOR:
            return Clause_check_state2();
        default:
            return -1;
    }
}

static int Clause_check_finish()
{
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -