summaryrefslogtreecommitdiffstats
path: root/types.h
diff options
context:
space:
mode:
authorjdlugosz963 <jdlugosz963@gmail.com>2023-03-01 23:30:31 +0100
committerjdlugosz963 <jdlugosz963@gmail.com>2023-03-01 23:30:31 +0100
commitf44f1f8c7ef7b6266667dce76db686af3258adfc (patch)
treee0775e2a07713f1ac23d37b5271340fe8cbebd16 /types.h
downloadjadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.tar.gz
jadl-f44f1f8c7ef7b6266667dce76db686af3258adfc.zip
Build simple abstract syntax tree
Diffstat (limited to 'types.h')
-rw-r--r--types.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/types.h b/types.h
new file mode 100644
index 0000000..632e283
--- /dev/null
+++ b/types.h
@@ -0,0 +1,65 @@
1#ifndef _TYPES
2#define _TYPES
3
4#include <stddef.h>
5#include <stdlib.h>
6#include <string.h>
7
8#include "memory.h"
9
10
11typedef enum _LispType {
12 LISP_TYPE_SYMBOL,
13 LISP_TYPE_LIST,
14 LISP_TYPE_STRING,
15 LISP_TYPE_NUMBER,
16 LISP_TYPE_NIL,
17 LISP_TYPE_TRUE,
18 LISP_TYPE_FALSE,
19 LISP_TYPE_ERROR
20} LispType;
21
22
23typedef struct _List {
24 void *ptr;
25 struct _List *next;
26} List;
27
28List *list_make(void *ptr);
29List *list_push(List *list, void *ptr);
30List *list_reverse(List *list);
31
32typedef struct _LispObject {
33 LispType type;
34 int is_decimal_point;
35
36 union {
37 char *string;
38 char *symbol;
39 char *error;
40 long long *number_natural;
41 double *number_float;
42 struct _LispObject (*function)(struct _LispObject*);
43 List *list;
44 void *ptr;
45 } value;
46} LISP_OBJECT;
47
48void lisp_object_free(LISP_OBJECT *lisp_obj);
49
50void lisp_object_list_push(LISP_OBJECT *lisp_list_obj, void *ptr);
51
52LISP_OBJECT *lisp_object_make();
53LISP_OBJECT *lisp_object_make_list();
54LISP_OBJECT *lisp_object_make_number_natural(long long number);
55LISP_OBJECT *lisp_object_make_number_float(double number);
56LISP_OBJECT *lisp_object_make_string(char *str);
57LISP_OBJECT *lisp_object_make_symbol(char *str);
58LISP_OBJECT *lisp_object_make_error(char *str);
59LISP_OBJECT *lisp_object_make_nil();
60LISP_OBJECT *lisp_object_make_true();
61LISP_OBJECT *lisp_object_make_false();
62
63int lisp_object_print(LISP_OBJECT *obj, int indent);
64
65#endif