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

📄 varproc.cpp

📁 一个小型C语言编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    if (tok == ID) {//当前ID是变量
        varname = token;
        line_no = lineno;
        if (varname == NULL) {
            printf("[%s][%d]:error id\n", __FILE__, __LINE__);
            exit(1);
        }
        //把变量插入到变量表中
        {
            VAR_USE_REC temp = {0};

            temp.line = line_no;
            temp.name = varname;
            temp.use_type = REF_STATE;//USE_STATE;

            VarInsert(temp);
        }
        varname = NULL;
        return Expr_check_state3();
    } else if (isnum(tok)) {
        return Expr_check_state3();
    }else if (tok == ')') {
        return Expr_check_finish();
    } else {//
        return -1;
    }
}

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

    tok = gettok();
    if(tok == EOI) {
        return -5;
    }

    if (tok == ',') {
        return Expr_check_state4();
    } else if (tok == ')') {
        return Expr_check_finish();
    } else {
        return -1;
    }
}



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

    tok = gettok();
    if(tok == EOI) {
        return -5;
    }

    if (tok == 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;
        return Expr_check_state3();
    } else if (isnum(tok)) {
        return Expr_check_state3();
    } else {
        return -1;
    }
}



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

    tok = gettok();

    if( tok == EOI ) {
        return -5;//END_OF_FILE
    }

    if (isoperator(tok)){//当前ID是变量名称,调用状态2处理
        //把这个变量加入到变量表中
        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;
        return Expr_check_state1();
    } else if (tok == '('){ //当前ID是函数名称,调用状态3处理
        varname = NULL;
        return Expr_check_state2();
    } else {
        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 tok;
    }
}


/*
变量定义,函数声明,函数定义

                                                              [START]
                                                                 |
                                                                 |  TYPE(int float double char ...)
                                                                 \/
                                                                [S1]
                                                                 |
                                                                 |  ID
                                                                 \/        =
                                             [S3]<--------------[S2]------------->[S9]<--------\
                                              |                  |                 |           |
                                              |TYPE              | ,               |           |
                                              \/                 |                 | ID/NUM    |
                                            [S12]                |                 |           |
                                              |                  \/       ,        \/          |
                                              |ID               [S7]<------------[S10]<--\     |
                            {                 \/                 |                 |     |     | =
                  [FUN1}<-------[S6]<-------[S4]<-----\          |                 |     |     |
                    |             |           |       |          |ID               |OP   |ID   |
                    |             |           | ,     |ID        |                 |     |NUM  |
                    |             |           |       |          |                 \/    |     |
                    |             |           |      [S13]       |               [S11]---/     |
                    |             |           |       /\         |                             |
                    |             |           |       |         [S8]---------------------------/
                    |             |           \/      |TYPE      | ;
                    |             |          [S5]-----/          |
                    |             |    :                         \/
                    |             \------->[FUN2]------------->[FINISH]
                    |                                            /\
                    |                                            |
                    \--------------------------------------------/

变量定义中没有数组,没有指针,没有自定义数据类型(只包含基本数据类型:int char long short )

*/

int Define_proc()
{
    return Define_check_state1();
}

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

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

    if(tok == ID) {
        //需要根据后一个符号决定是否保存到变量表中
        varname = token;
        line_no = lineno;
        return Define_check_state2();
    } else {
        return -1;
    }    
}

static int Define_check_state2()
{
    int tok = gettok();

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


    switch(tok) {
        case '(':
            //函数定义,建立新的作用域
            {
                VAR_LVL_RECORD *temp = NULL;

                temp = (VAR_LVL_RECORD*)malloc(sizeof (VAR_LVL_RECORD));
                if(temp == NULL) {
                    printf("mem alloc fail!\n");
                    exit(0);
                }
                memset(temp, 0, sizeof (VAR_LVL_RECORD));

                temp->parent = CurVarRec;
                CurVarRec->child = temp;
                CurVarRec = temp;
            }
            varname = NULL;
            line_no = 0;
            return Define_check_state3();
            break;
        case '=':    
            //变量定义,执行插入操作
            {
                VAR_USE_REC temp = {0};

                temp.line = line_no;
                temp.name = varname;
                temp.use_type = DEFINE_STATE;

                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            return Define_check_state9();
            break;
        case ',':
            //变量定义,执行插入操作
            {
                VAR_USE_REC temp = {0};

                temp.line = line_no;
                temp.name = varname;
                temp.use_type = DEFINE_STATE;

                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            return Define_check_state7();
            break;
        case ';':
            //变量定义,执行插入操作
            {
                VAR_USE_REC temp = {0};

                temp.line = line_no;
                temp.name = varname;
                temp.use_type = DEFINE_STATE;

                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            return Define_check_finish();
            break;

        default:
            return -1;
    }
}

static int Define_check_state3()
{
    int tok = gettok();

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

    switch(tok)
    {
        case ')':
            return Define_check_state6();
            break;
        case TYPE:
            tok = gettok();
            if(tok == ID){
                //此ID为函数定义中的函数参数,执行插入操作
                varname = token;
                line_no = lineno;

                {
                    VAR_USE_REC temp = {0};

                    temp.line = line_no;
                    temp.name = varname;
                    temp.use_type = DEFINE_STATE;

                    VarInsert(temp);
                }
                varname = NULL;
                line_no = 0;

                return Define_check_state4();
            }
            else
                return -1;    
            break;

        default:
                return -1;
            break;
    }
}

static int Define_check_state4()
{
    int tok = gettok();

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

    switch(tok)
    {
        case ')':
            return Define_check_state6();
            break;
        case ',':    
            return Define_check_state5();
            break;
        default:
            return -1;
    }
}

static int Define_check_state5()
{
    int tok = gettok();

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

    if(istype(tok)) {
        tok = gettok();
        if(tok == ID) {
            //此ID为函数定义中的函数参数,执行插入操作
            varname = token;
            line_no = lineno;
            {
                VAR_USE_REC temp = {0};

                temp.line = line_no;
                temp.name = varname;
                temp.use_type = DEFINE_STATE;
                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            return Define_check_state4();
        }
        else
            return -1;
    } else {
        return  -1;
    }
}


static int Define_check_state6()
{
    int tok = gettok();

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

    switch(tok) {
        case '{':
            return Define_check_Fun1();
            break;
        case ';':    
            return Define_check_Fun2();
            break;
        default:
            return -1;
    }
}


static int Define_check_state7()
{
    int tok = gettok();

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

    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 = DEFINE_STATE;
                VarInsert(temp);
            }
            varname = NULL;
            line_no = 0;
            return Define_check_state8();
            break;
        default:
            return -1;
    }
}


static int Define_check_state8()
{
    int tok = gettok();

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

    switch(tok) {
        case ',':
            return Define_check_state7();
            break;
        case '=':    
            return Define_check_state9();
            break;
        case ';':    
            return Define_check_finish();
            break;
        default:
            return -1;
    }
}


static int Define_check_state9()
{
    int tok = gettok();

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

    if (tok == 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;
        return Define_check_state10();
    } else if (isnum(tok)) {
        return Define_check_state10();
    } else {
        return -1;
    }
}


static int Define_check_state10()
{
    int tok = gettok();

    if (tok == EOI) {
        return -5; // end of  file
    }
    
    if (tok == ',') {
        return Define_check_state7();
    } else if (isoperator(tok)) {
        return Define_check_state11();
    } else {
        return -1;
    }
}


static int Define_check_state11()
{
    int tok = gettok();

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

    if (tok == 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;
        return Define_check_state10();
    } else if (isnum(tok)) {
        return Define_check_state10();
    } else {
        return -1;
    }
}

static int Define_check_Fun1()
{
    //进入函数体,此前函数参数应当已经插入变量表,作用域为整个函数体
    return 0;
}

static int Define_check_Fun2()
{
    //函数定义以';'结束,未进入函数体,
    //此前函数参数应当已经插入变量表,且此时应当从变量表中删除函数参数,
    //返回上一层作用域

    //释放变量使用记录表的资源
    //varlistfree(CurVarRec->varlist);

    //释放当前层的记录块
    CurVarRec = CurVarRec->parent;
    free(CurVarRec->child);

⌨️ 快捷键说明

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