Let's write β

プログラミング中にできたことか、思ったこととか

WORD DICTIONARYテスト

とりあえずForth風のWORDディクショナリのテストをする為に適当に習作プログラムを記述してます。

// main.c
#include <stdio.h>
#include <stdlib.h>
#include "word.h"

void print(void);

int main(int argc, char** argv)
{
	struct word* res;
	addfword("test1",NULL);
	addcword("test2",&print);
	addfword("test3",NULL);
	set_immediate();
	set_compile_only();
	res = findword("test1");
	if(res != NULL) {
		printf("FIND: %s\n",res->word_pointer);
	}
	else {
		printf("CANT FIND ANY DATA\n");
	}
	return 0;
}

void print(void)
{
	printf("\tTHIS IS CWORD\n");
}
//word.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "word.h"

//initialize word_dict header
struct word* word_dict = NULL;

//register new forth word
void addfword(char* wp, char* pp)
{
	struct word* newword;
	printf("ADD FORTH WORD\n");
	printf("\tNAME: %s\n",wp);
	newword = (struct word*)malloc(sizeof(struct word));
	//add data
	newword->word_pointer = wp;
	newword->prog_pointer = pp;
	newword->type = FWORD;
	newword->function = NULL;
	newword->immediate = 0;
	newword->compile_only = 0;
	//if first word
	if(word_dict == NULL) {
		//register as first word
		newword->next = NULL;
		word_dict = newword;
	}
	else {
		//add top
		newword->next = word_dict;
		//refresh word_head
		word_dict = newword;
	}
}

void addcword(char* wp, void (*cfunction)(void))
{
	struct word* newword;
	printf("ADD C WORD\n");
	printf("\tNAME: %s\n",wp);
	newword = (struct word*)malloc(sizeof(struct word));
	//add data
	newword->word_pointer = wp;
	newword->prog_pointer = NULL;
	newword->type = CWORD;
	newword->function = cfunction;
	newword->immediate = 0;
	newword->compile_only = 0;
	//if first word
	if(word_dict == NULL) {
		//register as first word
		newword->next = NULL;
		word_dict = newword;
	}
	else {
		//add top
		newword->next = word_dict;
		//refresh word_head
		word_dict = newword;
	}
}

struct word* findword(char* name)
{
	struct word* curr_word;
	printf("FIND WORD\n");
	curr_word = word_dict;
	while(curr_word != NULL) {
		printf("\tCURRENT WORD NAME IS: %s\n",curr_word->word_pointer);
		if(curr_word->type == FWORD) {
			printf("\tTHIS IS FWORD\n");
		}
		else if(curr_word->type == CWORD) {
			curr_word->function();
		}
		if(strcmp(curr_word->word_pointer, name) == 0) {
			return curr_word;
		}
		curr_word = curr_word->next;
	}
	return NULL;
}

void set_immediate(void)
{
	printf("SET IMMEDIATE\n");
	printf("\tWORD: %s\n",word_dict->word_pointer);
	word_dict->immediate = 1;
}

void set_compile_only(void)
{
	printf("SET COMPILE ONLY\n");
	printf("\tWORD: %s\n",word_dict->word_pointer);
	word_dict->compile_only = 1;
}
//word.h

#ifndef _WORD_H_
#define _WORD_H_

typedef void (*FUNCPTR)(void);

enum WORDTYPE {
	CWORD,
	FWORD,
};

struct word {
	//Pointer to word name
	char* word_pointer;
	//Pointer to program code (enabled if word is FWORD)
	char* prog_pointer;
	//Pointer for c function
	FUNCPTR function;
	//flag of function type
	int type;
	//flag of immediate word
	int immediate;
	//flag of compile-only word
	int compile_only;
	//Pointer to next word
	struct word* next;
};

//word_dictionary head pointer
struct word* word_dict; 

//add new forth word to dictionary
void addfword(char*, char*);
//add new c word to dictionary
void addcword(char*, void (*cfunction)(void));
//find registerd word with name
struct word* findword(char*);
//set immediate latest word
void set_immediate(void);
//set compile only latest word
void set_compile_only(void);

#endif

単純にCWORDでCで定義された関数,FWORDでforthで定義されているワードという区別を付けて、
最新に登録されたワードから検索、先頭に追加、そしてCWORDならば登録された関数の実行のテストをしています。
こんな感じでWORDのディクショナリは実装できそうですね。