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

📄 varproc_1.c

📁 一个小型C语言编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>

#include "datatypedef.h"
#include "input.h"
#include "string.h"
#include "token.h"
#include "debug.h"

extern char* token; 

extern VAR_LVL_RECORD* CurVarRec;








int isnum(int tok) 
{
    if (tok == ICON || tok == FCON) {
        return 1;
    } else {
        return 0;
    }
}


int isoperator(int tok)
{
    if(tok == '+' || tok == '-' || tok == '*' || tok == '/' ||
       tok == '!' || tok == '=' || tok == '>' || tok == '<' ||
       tok == '&' || tok == '|' || tok == '~' || tok == '^' ||
       (tok >= 50 && tok <= 57)   // &&, ||, <=, ==, !=, >=, >>, <<
       ) {
        return 1;
    } else {
        return 0;
    }
}
/*
if while for 语句中表达式的检测
                        ID/NUM
                   +-------------+
                   |             |
         ID        \/     OP     |
[START]------->[Finish]-------->[S1]
                |    /\
               (|    |)    )
                |    |<----------+
                \/   |   ID/NUM  |     ,
               [   S2  ]------->[S3]------>[S4]
                                 /\         |
                                 |  ID/NUM  |
                                 +----------+

可以是ID,ID OP ID,Func(ID,...)
*/

static int line_no;
static char* varname = NULL;

int Expr_check_start();
int Expr_check_finish();
int Expr_check_state1();
int Expr_check_state2();
int Expr_check_state3();
int Expr_check_state4();


int Expr_check_start(void)
{
    int tok = -1;

    tok = gettok();

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

    if(tok == ID){
        varname = token;
        line_no = lineno; 
        if(varname == NULL) {
            printf("[%s][%d]:error id\\n", __FILE__, __LINE__);
            exit(1);
        }
        return Expr_check_finish();
    } else {
        printf("[%s][%d]:wrong express\n", __FILE__, __LINE__);
        return -1;
    }

}

int Expr_check_state1()
{
    int tok = -1;

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

    if (tok == ID) {//当前是变量名称
        varname = token;
        line_no = lineno;
        if (varname == NULL) {
            printf("[%s][%d]:error id\n", __FILE__, __LINE__);
            exit(1);
        }

        //把这个变量加入到变量表中
        varname = NULL;
        return Expr_check_finish();
    }else if (isnum(tok)){
        return Expr_check_finish();
    } else {
        printf("[%s][%d]: error input\n", __FILE__, __LINE__);
        return -1;
    }

}

int Expr_check_state2()
{
    int tok = -1;

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

    if (tok == ID) {//当前ID是变量
        varname = token;
        line_no = lineno;
        if (varname == NULL) {
            printf("[%s][%d]:error id\n", __FILE__, __LINE__);
            exit(1);
        }
        //把变量插入到变量表中
        {
            
        }
        varname = NULL;
        return Expr_check_state3();
    } else if (isnum(tok)) {
        return Expr_check_state3();
    }else if (tok == ')') {
        return Expr_check_finish();
    } else {//
        return -1;
    }
}

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



int Expr_check_state4()
{
    int tok = -1;

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

    if (tok == ID) {
        varname = token;
        line_no = lineno;
        //加入变量表
        {
            
        }
        varname = NULL;
        line_no = 0;
        return Expr_check_state3();
    } else if (isnum(tok)) {
        return Expr_check_state3();
    } else {
        return -1;
    }
}










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;
        {
            
        }
        varname = NULL;
        line_no = 0;
        return Expr_check_state1();
    } else if (tok == '('){ //当前ID是函数名称,调用状态3处理
        varname = NULL;
        return Expr_check_state2();
    } else {
        if (varname) {
            //把这个变量加入到变量表中
            {
                
            }
            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();
int Define_check_state1();
int Define_check_state2();
int Define_check_state3();
int Define_check_state4();
int Define_check_state5();
int Define_check_state6();
int Define_check_state7();
int Define_check_state8();
int Define_check_state9();
int Define_check_state10();
int Define_check_state11();
int Define_check_Fun1();
int Define_check_Fun2();
int Define_check_finish();

static int tokTemp;

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

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

⌨️ 快捷键说明

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