-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathast.h
131 lines (101 loc) · 2.83 KB
/
ast.h
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#ifndef AST_H
#define AST_H
#include <stddef.h>
#include "model/object.h"
#include "runtime/symboltable.h"
/* Kind Tag Enums */
typedef enum {
SEG_INTEGER,
SEG_STRING,
SEG_SYMBOL,
SEG_VAR,
SEG_BLOCK,
SEG_METHODCALL
} seg_expr_kind;
/* Forward Declarations */
struct seg_expr_node;
/* Literals */
typedef struct {
int64_t value;
} seg_integer_node;
typedef struct {
const char *value;
uint64_t length;
} seg_string_node;
typedef struct {
seg_object value;
} seg_symbol_node;
/* Variable References */
typedef struct {
seg_object varname;
} seg_var_node;
/* Blocks */
typedef struct seg_parameter_list {
seg_object parameter;
struct seg_parameter_list *next;
} seg_parameter_list;
typedef struct {
seg_parameter_list *parameters;
struct seg_expr_node *first;
struct seg_expr_node *last;
} seg_block_node;
/* Method Invocation */
typedef struct seg_arg_list {
/* Keyword will most often be left as NULL. */
seg_object keyword;
struct seg_expr_node *value;
struct seg_arg_list *next;
} seg_arg_list;
typedef struct {
struct seg_expr_node *receiver;
seg_object selector;
seg_arg_list *args;
} seg_methodcall_node;
/* Grouping Constructs */
typedef struct seg_expr_node {
union {
seg_integer_node integer;
seg_string_node string;
seg_symbol_node symbol;
seg_var_node var;
seg_block_node block;
seg_methodcall_node methodcall;
} child;
seg_expr_kind child_kind;
struct seg_expr_node *next;
} seg_expr_node;
/* Visitor */
// FIXME don't do this.
typedef struct seg_ast_visitor* seg_ast_visitor;
/*
Determine if a visit handler is being invoked before or after any child nodes
have been visited.
*/
typedef enum {
SEG_VISIT_PRE,
SEG_VISIT_POST
} seg_visit_when;
typedef void (*seg_integer_handler)(seg_integer_node *node, void *state);
typedef void (*seg_string_handler)(seg_string_node *node, void *state);
typedef void (*seg_symbol_handler)(seg_symbol_node *node, void *state);
typedef void (*seg_methodcall_handler)(seg_methodcall_node *node, void *state);
typedef void (*seg_var_handler)(seg_var_node *node, void *state);
typedef void (*seg_block_handler)(seg_block_node *node, void *state);
seg_ast_visitor seg_new_ast_visitor();
void seg_ast_visit_integer(seg_ast_visitor visitor, seg_integer_handler visit);
void seg_ast_visit_string(seg_ast_visitor visitor, seg_string_handler visit);
void seg_ast_visit_symbol(seg_ast_visitor visitor, seg_symbol_handler visit);
void seg_ast_visit_methodcall(
seg_ast_visitor visitor,
seg_visit_when when,
seg_methodcall_handler visit
);
void seg_ast_visit_var(seg_ast_visitor visitor, seg_var_handler);
void seg_ast_visit_block(seg_ast_visitor visitor, seg_visit_when, seg_block_handler visit);
void seg_ast_visit(
seg_ast_visitor visitor,
seg_block_node *root,
void *state
);
void seg_delete_ast_visitor(seg_ast_visitor visitor);
#endif