1

我正在用 C 语言做一个 Forth 解释器。我无法决定如何更好地实现 Forth 字典。

struct Word {
   struct Word* next;
      char* name;
      int* opcode;
      // int arg_count;
}
struct Dictionary {
    struct Word words;
    int size;
}

opcode是一系列代码 - 单词的功能。所以每个opcode[i]对应于某个函数。我想它应该是一些带有元素的表[opcode<->function pointer]。但是如何实施呢?

我们不知道函数的大小。我们不能使用void*(或者我们可以?),因为我们必须以某种方式只让操作码执行该函数。

我应该怎么办?

4

2 回答 2

4

这个定义的一些变化在传统的 Forth 实现中很常见:

typedef int cell;
typedef void code_t (struct Word *);

struct Word
{
  char name[NAME_LENGTH];
  struct Word *next;
  code_t *code;
  cell body[];  /* Upon instantiation, this could be zero or more items. */
};

然后字典将成为通过next指针链接的列表。字按顺序分配,交错struct Word标题和body数据。

要执行一个词,请调用word->code(word);。指向的函数code然后可以决定如何处理body。主体可以是数据,也可以是您所说的“操作码”。

冒号定义将code指向如下内容:

void docolon (struct Word *word)
{
  /* IP is a variable holding the instruction pointer. */
  rpush (IP); /* Push the current instruction pointer to the return stack. */
  IP = (struct Word *)word->body; /* Start executing the word body (opcodes). */
}

而原始词,例如+,看起来像

void plus (struct Word *word)
{
  cell n1 = pop();
  cell n2 = pop();
  push (n1 + n2);
}
于 2013-10-22T13:57:12.823 回答
1

以下所有这些都基于一个假设:您要声明函数指针。

typedef int (*OPCODE)(char *);

struct Word 
{
    struct Word* next;
    char* name;
    OPCODE *opcode;
    // int arg_count;
};

opcode是一个函数指针,指向一个返回整数并以 achar *作为参数的函数。一个非常好的关于函数指针的简短教程页面是Lars Engelfried的函数指针教程

于 2013-10-22T12:25:03.750 回答