From f44f1f8c7ef7b6266667dce76db686af3258adfc Mon Sep 17 00:00:00 2001 From: jdlugosz963 Date: Wed, 1 Mar 2023 23:30:31 +0100 Subject: Build simple abstract syntax tree --- types.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 types.h (limited to 'types.h') diff --git a/types.h b/types.h new file mode 100644 index 0000000..632e283 --- /dev/null +++ b/types.h @@ -0,0 +1,65 @@ +#ifndef _TYPES +#define _TYPES + +#include +#include +#include + +#include "memory.h" + + +typedef enum _LispType { + LISP_TYPE_SYMBOL, + LISP_TYPE_LIST, + LISP_TYPE_STRING, + LISP_TYPE_NUMBER, + LISP_TYPE_NIL, + LISP_TYPE_TRUE, + LISP_TYPE_FALSE, + LISP_TYPE_ERROR +} LispType; + + +typedef struct _List { + void *ptr; + struct _List *next; +} List; + +List *list_make(void *ptr); +List *list_push(List *list, void *ptr); +List *list_reverse(List *list); + +typedef struct _LispObject { + LispType type; + int is_decimal_point; + + union { + char *string; + char *symbol; + char *error; + long long *number_natural; + double *number_float; + struct _LispObject (*function)(struct _LispObject*); + List *list; + void *ptr; + } value; +} LISP_OBJECT; + +void lisp_object_free(LISP_OBJECT *lisp_obj); + +void lisp_object_list_push(LISP_OBJECT *lisp_list_obj, void *ptr); + +LISP_OBJECT *lisp_object_make(); +LISP_OBJECT *lisp_object_make_list(); +LISP_OBJECT *lisp_object_make_number_natural(long long number); +LISP_OBJECT *lisp_object_make_number_float(double number); +LISP_OBJECT *lisp_object_make_string(char *str); +LISP_OBJECT *lisp_object_make_symbol(char *str); +LISP_OBJECT *lisp_object_make_error(char *str); +LISP_OBJECT *lisp_object_make_nil(); +LISP_OBJECT *lisp_object_make_true(); +LISP_OBJECT *lisp_object_make_false(); + +int lisp_object_print(LISP_OBJECT *obj, int indent); + +#endif -- cgit v1.2.3