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

📄 varproc_1.c

📁 一个小型C语言编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
                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;
    }
}

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

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

    switch(tok)
    {
        case ')':
            return Define_check_state6();
            break;
        default:
            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;    
                break;
            } else {
                return -1;
            }
            break;
    }
}

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;
    }
}

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;
    }
}


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;
    }
}


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;
    }
}


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;
    }
}


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 = USE_STATE;
            VarInsert(temp);
        }
        varname = NULL;
        line_no = 0;
        return Define_check_state10();
    } else if (isnum(tok)) {
        return Define_check_state10();
    } else {
        return -1;
    }
}


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;
    }
}


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 = USE_STATE;
            VarInsert(temp);
        }
        varname = NULL;
        line_no = 0;
        return Define_check_state10();
    } else if (isnum(tok)) {
        return Define_check_state10();
    } else {
        return -1;
    }
}

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

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

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

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

int    Define_check_finish()
{
    return 0;
}

⌨️ 快捷键说明

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