aboutsummaryrefslogtreecommitdiff
path: root/interpreter/syntax.h
blob: e2accd4eb5ada342e0d1b61f358acb556c33a8fe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#ifndef _H_SYNTAX
#define _H_SYNTAX

/* TOKENS */

typedef enum {
	TOKEN_SEMICOLON, /* ; */
	TOKEN_EQUALS,    /* = */
	TOKEN_OPEN_SQ,   /* [ */
	TOKEN_CLOSE_SQ,  /* ] */
	TOKEN_OPEN_P,    /* ( */
	TOKEN_CLOSE_P,   /* ) */
	TOKEN_COMMA,     /* , */
	TOKEN_COLON,     /* : */
	TOKEN_STRICT,    /* ! */
	TOKEN_CODE,      /* code */
	TOKEN_NAME,
	TOKEN_INT
} token_kind;

typedef struct {
	token_kind kind;
	void* var;
} token;

typedef struct token_list {
	token elem;
	struct token_list* rest;
} token_list;

void free_token(token*);
void free_token_list(token_list*);

/* ELEMENTS */

typedef enum {
	EXPR_INT,
	EXPR_NAME,
	EXPR_CODE,
	EXPR_LIST,
	EXPR_TUPLE,
	EXPR_APP
} expr_kind;

typedef struct {
	expr_kind kind;
	unsigned is_strict;
	void* var1;
	void* var2;
} expression;

typedef struct arg_list {
	expression elem;
	struct arg_list* rest;
} arg_list;

typedef struct {
	char* name;
	arg_list* args;
	expression rhs;
} rewrite_rule;

typedef struct fuspel {
	rewrite_rule rule;
	struct fuspel* rest;
} fuspel;

unsigned empty_args_list(arg_list*);
unsigned char len_arg_list(arg_list*);

void cpy_expression(expression* dst, expression* src);
unsigned eq_expression(expression*, expression*);
expression** flatten_app_args(expression*);

void concat_fuspel(fuspel* start, fuspel* end);
fuspel* push_fuspel(fuspel*);
fuspel* pop_fuspel(fuspel*);
fuspel* popn_fuspel(fuspel*, unsigned char);

void free_expression(expression*);
void free_arg_list(arg_list*);
void free_rewrite_rule(rewrite_rule*);
void free_fuspel(fuspel*);

#endif