aboutsummaryrefslogtreecommitdiff
path: root/src/tree_sitter/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree_sitter/parser.h')
-rw-r--r--src/tree_sitter/parser.h67
1 files changed, 54 insertions, 13 deletions
diff --git a/src/tree_sitter/parser.h b/src/tree_sitter/parser.h
index 2b14ac1..17f0e94 100644
--- a/src/tree_sitter/parser.h
+++ b/src/tree_sitter/parser.h
@@ -13,9 +13,8 @@ extern "C" {
#define ts_builtin_sym_end 0
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
-typedef uint16_t TSStateId;
-
#ifndef TREE_SITTER_API_H_
+typedef uint16_t TSStateId;
typedef uint16_t TSSymbol;
typedef uint16_t TSFieldId;
typedef struct TSLanguage TSLanguage;
@@ -87,6 +86,11 @@ typedef union {
} entry;
} TSParseActionEntry;
+typedef struct {
+ int32_t start;
+ int32_t end;
+} TSCharacterRange;
+
struct TSLanguage {
uint32_t version;
uint32_t symbol_count;
@@ -126,13 +130,38 @@ struct TSLanguage {
const TSStateId *primary_state_ids;
};
+static inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {
+ uint32_t index = 0;
+ uint32_t size = len - index;
+ while (size > 1) {
+ uint32_t half_size = size / 2;
+ uint32_t mid_index = index + half_size;
+ TSCharacterRange *range = &ranges[mid_index];
+ if (lookahead >= range->start && lookahead <= range->end) {
+ return true;
+ } else if (lookahead > range->end) {
+ index = mid_index;
+ }
+ size -= half_size;
+ }
+ TSCharacterRange *range = &ranges[index];
+ return (lookahead >= range->start && lookahead <= range->end);
+}
+
/*
* Lexer Macros
*/
+#ifdef _MSC_VER
+#define UNUSED __pragma(warning(suppress : 4101))
+#else
+#define UNUSED __attribute__((unused))
+#endif
+
#define START_LEXER() \
bool result = false; \
bool skip = false; \
+ UNUSED \
bool eof = false; \
int32_t lookahead; \
goto start; \
@@ -148,6 +177,17 @@ struct TSLanguage {
goto next_state; \
}
+#define ADVANCE_MAP(...) \
+ { \
+ static const uint16_t map[] = { __VA_ARGS__ }; \
+ for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \
+ if (map[i] == lookahead) { \
+ state = map[i + 1]; \
+ goto next_state; \
+ } \
+ } \
+ }
+
#define SKIP(state_value) \
{ \
skip = true; \
@@ -166,7 +206,7 @@ struct TSLanguage {
* Parse Table Macros
*/
-#define SMALL_STATE(id) id - LARGE_STATE_COUNT
+#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)
#define STATE(id) id
@@ -176,7 +216,7 @@ struct TSLanguage {
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
- .state = state_value \
+ .state = (state_value) \
} \
}}
@@ -184,7 +224,7 @@ struct TSLanguage {
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
- .state = state_value, \
+ .state = (state_value), \
.repetition = true \
} \
}}
@@ -197,14 +237,15 @@ struct TSLanguage {
} \
}}
-#define REDUCE(symbol_val, child_count_val, ...) \
- {{ \
- .reduce = { \
- .type = TSParseActionTypeReduce, \
- .symbol = symbol_val, \
- .child_count = child_count_val, \
- __VA_ARGS__ \
- }, \
+#define REDUCE(symbol_name, children, precedence, prod_id) \
+ {{ \
+ .reduce = { \
+ .type = TSParseActionTypeReduce, \
+ .symbol = symbol_name, \
+ .child_count = children, \
+ .dynamic_precedence = precedence, \
+ .production_id = prod_id \
+ }, \
}}
#define RECOVER() \