plum

#treesitter#compiler#wasm

git clone https://git.pyrossh.dev/plum

A statically typed, imperative programming language inspired by rust, python


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