OR-1 dataflow CPU sketch
1#ifndef TREE_SITTER_PARSER_H_
2#define TREE_SITTER_PARSER_H_
3
4#ifdef __cplusplus
5extern "C" {
6#endif
7
8#include <stdbool.h>
9#include <stdint.h>
10#include <stdlib.h>
11
12#define ts_builtin_sym_error ((TSSymbol)-1)
13#define ts_builtin_sym_end 0
14#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
15
16#ifndef TREE_SITTER_API_H_
17typedef uint16_t TSStateId;
18typedef uint16_t TSSymbol;
19typedef uint16_t TSFieldId;
20typedef struct TSLanguage TSLanguage;
21typedef struct TSLanguageMetadata {
22 uint8_t major_version;
23 uint8_t minor_version;
24 uint8_t patch_version;
25} TSLanguageMetadata;
26#endif
27
28typedef struct {
29 TSFieldId field_id;
30 uint8_t child_index;
31 bool inherited;
32} TSFieldMapEntry;
33
34// Used to index the field and supertype maps.
35typedef struct {
36 uint16_t index;
37 uint16_t length;
38} TSMapSlice;
39
40typedef struct {
41 bool visible;
42 bool named;
43 bool supertype;
44} TSSymbolMetadata;
45
46typedef struct TSLexer TSLexer;
47
48struct TSLexer {
49 int32_t lookahead;
50 TSSymbol result_symbol;
51 void (*advance)(TSLexer *, bool);
52 void (*mark_end)(TSLexer *);
53 uint32_t (*get_column)(TSLexer *);
54 bool (*is_at_included_range_start)(const TSLexer *);
55 bool (*eof)(const TSLexer *);
56 void (*log)(const TSLexer *, const char *, ...);
57};
58
59typedef enum {
60 TSParseActionTypeShift,
61 TSParseActionTypeReduce,
62 TSParseActionTypeAccept,
63 TSParseActionTypeRecover,
64} TSParseActionType;
65
66typedef union {
67 struct {
68 uint8_t type;
69 TSStateId state;
70 bool extra;
71 bool repetition;
72 } shift;
73 struct {
74 uint8_t type;
75 uint8_t child_count;
76 TSSymbol symbol;
77 int16_t dynamic_precedence;
78 uint16_t production_id;
79 } reduce;
80 uint8_t type;
81} TSParseAction;
82
83typedef struct {
84 uint16_t lex_state;
85 uint16_t external_lex_state;
86} TSLexMode;
87
88typedef struct {
89 uint16_t lex_state;
90 uint16_t external_lex_state;
91 uint16_t reserved_word_set_id;
92} TSLexerMode;
93
94typedef union {
95 TSParseAction action;
96 struct {
97 uint8_t count;
98 bool reusable;
99 } entry;
100} TSParseActionEntry;
101
102typedef struct {
103 int32_t start;
104 int32_t end;
105} TSCharacterRange;
106
107struct TSLanguage {
108 uint32_t abi_version;
109 uint32_t symbol_count;
110 uint32_t alias_count;
111 uint32_t token_count;
112 uint32_t external_token_count;
113 uint32_t state_count;
114 uint32_t large_state_count;
115 uint32_t production_id_count;
116 uint32_t field_count;
117 uint16_t max_alias_sequence_length;
118 const uint16_t *parse_table;
119 const uint16_t *small_parse_table;
120 const uint32_t *small_parse_table_map;
121 const TSParseActionEntry *parse_actions;
122 const char * const *symbol_names;
123 const char * const *field_names;
124 const TSMapSlice *field_map_slices;
125 const TSFieldMapEntry *field_map_entries;
126 const TSSymbolMetadata *symbol_metadata;
127 const TSSymbol *public_symbol_map;
128 const uint16_t *alias_map;
129 const TSSymbol *alias_sequences;
130 const TSLexerMode *lex_modes;
131 bool (*lex_fn)(TSLexer *, TSStateId);
132 bool (*keyword_lex_fn)(TSLexer *, TSStateId);
133 TSSymbol keyword_capture_token;
134 struct {
135 const bool *states;
136 const TSSymbol *symbol_map;
137 void *(*create)(void);
138 void (*destroy)(void *);
139 bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
140 unsigned (*serialize)(void *, char *);
141 void (*deserialize)(void *, const char *, unsigned);
142 } external_scanner;
143 const TSStateId *primary_state_ids;
144 const char *name;
145 const TSSymbol *reserved_words;
146 uint16_t max_reserved_word_set_size;
147 uint32_t supertype_count;
148 const TSSymbol *supertype_symbols;
149 const TSMapSlice *supertype_map_slices;
150 const TSSymbol *supertype_map_entries;
151 TSLanguageMetadata metadata;
152};
153
154static inline bool set_contains(const TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {
155 uint32_t index = 0;
156 uint32_t size = len - index;
157 while (size > 1) {
158 uint32_t half_size = size / 2;
159 uint32_t mid_index = index + half_size;
160 const TSCharacterRange *range = &ranges[mid_index];
161 if (lookahead >= range->start && lookahead <= range->end) {
162 return true;
163 } else if (lookahead > range->end) {
164 index = mid_index;
165 }
166 size -= half_size;
167 }
168 const TSCharacterRange *range = &ranges[index];
169 return (lookahead >= range->start && lookahead <= range->end);
170}
171
172/*
173 * Lexer Macros
174 */
175
176#ifdef _MSC_VER
177#define UNUSED __pragma(warning(suppress : 4101))
178#else
179#define UNUSED __attribute__((unused))
180#endif
181
182#define START_LEXER() \
183 bool result = false; \
184 bool skip = false; \
185 UNUSED \
186 bool eof = false; \
187 int32_t lookahead; \
188 goto start; \
189 next_state: \
190 lexer->advance(lexer, skip); \
191 start: \
192 skip = false; \
193 lookahead = lexer->lookahead;
194
195#define ADVANCE(state_value) \
196 { \
197 state = state_value; \
198 goto next_state; \
199 }
200
201#define ADVANCE_MAP(...) \
202 { \
203 static const uint16_t map[] = { __VA_ARGS__ }; \
204 for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \
205 if (map[i] == lookahead) { \
206 state = map[i + 1]; \
207 goto next_state; \
208 } \
209 } \
210 }
211
212#define SKIP(state_value) \
213 { \
214 skip = true; \
215 state = state_value; \
216 goto next_state; \
217 }
218
219#define ACCEPT_TOKEN(symbol_value) \
220 result = true; \
221 lexer->result_symbol = symbol_value; \
222 lexer->mark_end(lexer);
223
224#define END_STATE() return result;
225
226/*
227 * Parse Table Macros
228 */
229
230#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)
231
232#define STATE(id) id
233
234#define ACTIONS(id) id
235
236#define SHIFT(state_value) \
237 {{ \
238 .shift = { \
239 .type = TSParseActionTypeShift, \
240 .state = (state_value) \
241 } \
242 }}
243
244#define SHIFT_REPEAT(state_value) \
245 {{ \
246 .shift = { \
247 .type = TSParseActionTypeShift, \
248 .state = (state_value), \
249 .repetition = true \
250 } \
251 }}
252
253#define SHIFT_EXTRA() \
254 {{ \
255 .shift = { \
256 .type = TSParseActionTypeShift, \
257 .extra = true \
258 } \
259 }}
260
261#define REDUCE(symbol_name, children, precedence, prod_id) \
262 {{ \
263 .reduce = { \
264 .type = TSParseActionTypeReduce, \
265 .symbol = symbol_name, \
266 .child_count = children, \
267 .dynamic_precedence = precedence, \
268 .production_id = prod_id \
269 }, \
270 }}
271
272#define RECOVER() \
273 {{ \
274 .type = TSParseActionTypeRecover \
275 }}
276
277#define ACCEPT_INPUT() \
278 {{ \
279 .type = TSParseActionTypeAccept \
280 }}
281
282#ifdef __cplusplus
283}
284#endif
285
286#endif // TREE_SITTER_PARSER_H_