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

opcodechar *整数を返し、引数としてa を取る関数への関数ポインタです。関数ポインターに関する短いチュートリアルの非常に優れたページは、Lars Engelfried によるThe Function Pointer Tutorialsです。

于 2013-10-22T12:25:03.750 に答える