queries
c.h c.scm cpp.h cpp.scm cuda.h cuda.scm glsl.h glsl.scm go.h go.scm javascript.h javascript.scm kotlin.h kotlin.scm lua.h lua.scm odin.h odin.scm php.h php.scm python.h python.scm rust.h rust.scm tcl.h tcl.scm zig.h zig.scmtests
test.c test.cpp test.cu test.cuh test.glsl test.go test.js test.kt test.lua test.odin test.php test.py test.rs test.tcl test.zigvendor
tree-sitter
lib
src
alloc.c alloc.h array.h atomic.h clock.h error_costs.h get_changed_ranges.c get_changed_ranges.h host.h language.c language.h length.h lexer.c lexer.h lib.c node.c parser.c point.h query.c reduce_action.h reusable_node.h stack.c stack.h subtree.c subtree.h tree.c tree.h tree_cursor.c tree_cursor.h unicode.h
vendor/tree-sitter/lib/include/tree_sitter/parser.h
raw
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;
21#endif
22
23typedef struct {
24 TSFieldId field_id;
25 uint8_t child_index;
26 bool inherited;
27} TSFieldMapEntry;
28
29typedef struct {
30 uint16_t index;
31 uint16_t length;
32} TSFieldMapSlice;
33
34typedef struct {
35 bool visible;
36 bool named;
37 bool supertype;
38} TSSymbolMetadata;
39
40typedef struct TSLexer TSLexer;
41
42struct TSLexer {
43 int32_t lookahead;
44 TSSymbol result_symbol;
45 void (*advance)(TSLexer *, bool);
46 void (*mark_end)(TSLexer *);
47 uint32_t (*get_column)(TSLexer *);
48 bool (*is_at_included_range_start)(const TSLexer *);
49 bool (*eof)(const TSLexer *);
50};
51
52typedef enum {
53 TSParseActionTypeShift,
54 TSParseActionTypeReduce,
55 TSParseActionTypeAccept,
56 TSParseActionTypeRecover,
57} TSParseActionType;
58
59typedef union {
60 struct {
61 uint8_t type;
62 TSStateId state;
63 bool extra;
64 bool repetition;
65 } shift;
66 struct {
67 uint8_t type;
68 uint8_t child_count;
69 TSSymbol symbol;
70 int16_t dynamic_precedence;
71 uint16_t production_id;
72 } reduce;
73 uint8_t type;
74} TSParseAction;
75
76typedef struct {
77 uint16_t lex_state;
78 uint16_t external_lex_state;
79} TSLexMode;
80
81typedef union {
82 TSParseAction action;
83 struct {
84 uint8_t count;
85 bool reusable;
86 } entry;
87} TSParseActionEntry;
88
89struct TSLanguage {
90 uint32_t version;
91 uint32_t symbol_count;
92 uint32_t alias_count;
93 uint32_t token_count;
94 uint32_t external_token_count;
95 uint32_t state_count;
96 uint32_t large_state_count;
97 uint32_t production_id_count;
98 uint32_t field_count;
99 uint16_t max_alias_sequence_length;
100 const uint16_t *parse_table;
101 const uint16_t *small_parse_table;
102 const uint32_t *small_parse_table_map;
103 const TSParseActionEntry *parse_actions;
104 const char * const *symbol_names;
105 const char * const *field_names;
106 const TSFieldMapSlice *field_map_slices;
107 const TSFieldMapEntry *field_map_entries;
108 const TSSymbolMetadata *symbol_metadata;
109 const TSSymbol *public_symbol_map;
110 const uint16_t *alias_map;
111 const TSSymbol *alias_sequences;
112 const TSLexMode *lex_modes;
113 bool (*lex_fn)(TSLexer *, TSStateId);
114 bool (*keyword_lex_fn)(TSLexer *, TSStateId);
115 TSSymbol keyword_capture_token;
116 struct {
117 const bool *states;
118 const TSSymbol *symbol_map;
119 void *(*create)(void);
120 void (*destroy)(void *);
121 bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
122 unsigned (*serialize)(void *, char *);
123 void (*deserialize)(void *, const char *, unsigned);
124 } external_scanner;
125 const TSStateId *primary_state_ids;
126};
127
128/*
129 * Lexer Macros
130 */
131
132#define START_LEXER() \
133 bool result = false; \
134 bool skip = false; \
135 bool eof = false; \
136 int32_t lookahead; \
137 goto start; \
138 next_state: \
139 lexer->advance(lexer, skip); \
140 start: \
141 skip = false; \
142 lookahead = lexer->lookahead; \
143 eof = lexer->eof(lexer);
144
145#define ADVANCE(state_value) \
146 { \
147 state = state_value; \
148 goto next_state; \
149 }
150
151#define SKIP(state_value) \
152 { \
153 skip = true; \
154 state = state_value; \
155 goto next_state; \
156 }
157
158#define ACCEPT_TOKEN(symbol_value) \
159 result = true; \
160 lexer->result_symbol = symbol_value; \
161 lexer->mark_end(lexer);
162
163#define END_STATE() return result;
164
165/*
166 * Parse Table Macros
167 */
168
169#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)
170
171#define STATE(id) id
172
173#define ACTIONS(id) id
174
175#define SHIFT(state_value) \
176 {{ \
177 .shift = { \
178 .type = TSParseActionTypeShift, \
179 .state = (state_value) \
180 } \
181 }}
182
183#define SHIFT_REPEAT(state_value) \
184 {{ \
185 .shift = { \
186 .type = TSParseActionTypeShift, \
187 .state = (state_value), \
188 .repetition = true \
189 } \
190 }}
191
192#define SHIFT_EXTRA() \
193 {{ \
194 .shift = { \
195 .type = TSParseActionTypeShift, \
196 .extra = true \
197 } \
198 }}
199
200#define REDUCE(symbol_val, child_count_val, ...) \
201 {{ \
202 .reduce = { \
203 .type = TSParseActionTypeReduce, \
204 .symbol = symbol_val, \
205 .child_count = child_count_val, \
206 __VA_ARGS__ \
207 }, \
208 }}
209
210#define RECOVER() \
211 {{ \
212 .type = TSParseActionTypeRecover \
213 }}
214
215#define ACCEPT_INPUT() \
216 {{ \
217 .type = TSParseActionTypeAccept \
218 }}
219
220#ifdef __cplusplus
221}
222#endif
223
224#endif // TREE_SITTER_PARSER_H_