开发编程语言(四):变量

随笔 2016-07-16

开头

变量的标识符与函数名规则一样,采用[A-Za-z_][A-Za-z_0-9]*识别.作为弱类型语言并不代表没有数据类型,而是其数据类型在运行时确定,不像编译型语言在编译阶段就确定.我们仍然需要对数据类型进行定义:

//变量类型
typedef enum {
    ORG_BOOLEAN_VALUE = 1, //布尔类型
    ORG_INT_VALUE,          //整型
    ORG_DOUBLE_VALUE,       //浮点型
    ORG_STRING_VALUE,       //字符串型
    ORG_NATIVE_POINTER_VALUE, //复杂数据类型
    ORG_NULL_VALUE,         //空值,未设置类型
} ORG_ValueType;

ORG_NATIVE_POINTER_VALUE可以说这个是指针类型,我更愿意说其是复杂的数据类型,在这里我将字符串型作为基本数据类型,是因为这个太常用了,并且移除了单字符和多字符的区别.

神奇的ORG_Value

这个数据类型将代表任何数据,在C中它的定义是:

typedef struct {
    ORG_ValueType type;
    union {
        ORG_Boolean boolean_value;
        int     int_value;
        double  double_value;
        ORG_String *string_value;
        ORG_NativePointer native_pointer;
    } u;
} ORG_Value;

ORG_Value 结构体用于保存origin中的每个值,并用枚举类型区别值的类型.对于无类型的语言来说,通常都是这样在值中保存本身的类型. 另外,复杂数据类型ORG_NativePointer的定义为:

//任意类型定义
typedef struct {
    ORG_NativePointerInfo *info;
    void *pointer;
} ORG_NativePointer;
//指针信息
typedef struct {
    char *name;
} ORG_NativePointerInfo;

pointer成员指向一些内部对象的指针.比如可以用来做文件指针.

变量

变量的分为局部变量全局变量.做了规定,在函数内声明的变量为局部变量;函数外声明的统统作为全局变量.

typedef struct Variable_tag {
    char        *name;
    ORG_Value   value;
    struct Variable_tag *next;
} Variable;

变量的查找是先在局部变量查找然后再到全局里找,关于变量的赋值,其右侧是个表达式:

/**
 * 变量赋值时调用
 * identifier
 */
static ORG_Value eval_assign_expression(ORG_Interpreter *inter, LocalEnvironment *env, char *identifier, Expression *expression) {
    ORG_Value v;
    Variable *left;

    //获得右侧表达式结果
    v = eval_expression(inter, env, expression);

    //查找局部变量
    left = org_search_local_variable(env, identifier);

    if (left == NULL) {//找不到在全局查找
        left = search_global_variable_form_env(inter, env, identifier);
    }

    if (left != NULL) {
        release_if_string(&left->value);
        left->value = v;
        refer_if_string(&v);
    } else { // 没有找到变量,注册新的变量
        if (env != NULL) {
            // 函数内的布局变量
            org_add_local_variable(env, identifier, &v);
        } else {
            // 函数外的全局变量
            ORG_add_global_variable(inter, identifier, &v);
        }
        refer_if_string(&v);
    }
    return v;
}

这里有用到一些未说明的函数和结构,都贴出来肯定会让读者晕头转向的.后续会慢慢补充.


本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!