运行用户自定义函数

像y_tab.exe, bigtab.exe这样的脚本解释程序,能够解释执行基本程序语句之后。如何让它们支持运行用户自定义函数呢?

引进函数机制之后,作用域就划分了全局域和局部域两个部分。
#define DM_FOR_GLOBAL 0
#define DM_FOR_LOCAL 1
int dmc;

struct symtab symtab_compile[2];
struct funxat funxat_compile[2];

symtab_compile和funxat_compile逻辑上是一个整体,区别是为了在编译时一个仅保存编译阶段用到的临时符号,一个保存作为编译结果需要持久保存的执行体和框架。数组[2]代表全局和局部两个域。

所有编译出来的函数都看成是 funxat_compile的复制品,只有执行体(即目标代码)不同。
struct funxat userfunc[…];
所有的userfunc都来自于funxat_compile[DM_FOR_LOCAL]的复制。

而所有的运行实例都看成是函数表中对应函数的复制品,只有分配局部变量的不同。
struct funxvt {
struct funxat *func;
VALUE_TYPE ret;
VALUE_TYPE *bp;
VALUE_TYPE **abp;
};

每一个函数的运行实例都来自于原函数funxat的复制。当然funxvt 分配在栈上。
#define ELETYPE struct funxvt
#define SEGLEN 100

struct segment {
struct segment *wrap;
ELETYPE e[SEGLEN];
};

typedef struct segment stack;
struct segment initseg;
struct segment *stk = &initseg;
int top;

这样,通过纵横2次扩展,解释程序在结构上具备了运行用户自定义函数的能力。

Guess you like

Origin blog.csdn.net/aaasssdddd96/article/details/114038739