diff options
| author | Thomas Voss <mail@thomasvoss.com> | 2023-09-28 03:44:06 +0200 | 
|---|---|---|
| committer | Thomas Voss <mail@thomasvoss.com> | 2023-09-28 03:44:52 +0200 | 
| commit | 94b1b4ad12c8bb04fc9ff84b1b9c0a707ad675a6 (patch) | |
| tree | f0e2bfad824935c2eb2e9fe22bec07164d038df2 /src/tree_sitter | |
Genesis commit
Diffstat (limited to 'src/tree_sitter')
| -rw-r--r-- | src/tree_sitter/parser.h | 224 | 
1 files changed, 224 insertions, 0 deletions
diff --git a/src/tree_sitter/parser.h b/src/tree_sitter/parser.h new file mode 100644 index 0000000..2b14ac1 --- /dev/null +++ b/src/tree_sitter/parser.h @@ -0,0 +1,224 @@ +#ifndef TREE_SITTER_PARSER_H_ +#define TREE_SITTER_PARSER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> + +#define ts_builtin_sym_error ((TSSymbol)-1) +#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 TSSymbol; +typedef uint16_t TSFieldId; +typedef struct TSLanguage TSLanguage; +#endif + +typedef struct { +  TSFieldId field_id; +  uint8_t child_index; +  bool inherited; +} TSFieldMapEntry; + +typedef struct { +  uint16_t index; +  uint16_t length; +} TSFieldMapSlice; + +typedef struct { +  bool visible; +  bool named; +  bool supertype; +} TSSymbolMetadata; + +typedef struct TSLexer TSLexer; + +struct TSLexer { +  int32_t lookahead; +  TSSymbol result_symbol; +  void (*advance)(TSLexer *, bool); +  void (*mark_end)(TSLexer *); +  uint32_t (*get_column)(TSLexer *); +  bool (*is_at_included_range_start)(const TSLexer *); +  bool (*eof)(const TSLexer *); +}; + +typedef enum { +  TSParseActionTypeShift, +  TSParseActionTypeReduce, +  TSParseActionTypeAccept, +  TSParseActionTypeRecover, +} TSParseActionType; + +typedef union { +  struct { +    uint8_t type; +    TSStateId state; +    bool extra; +    bool repetition; +  } shift; +  struct { +    uint8_t type; +    uint8_t child_count; +    TSSymbol symbol; +    int16_t dynamic_precedence; +    uint16_t production_id; +  } reduce; +  uint8_t type; +} TSParseAction; + +typedef struct { +  uint16_t lex_state; +  uint16_t external_lex_state; +} TSLexMode; + +typedef union { +  TSParseAction action; +  struct { +    uint8_t count; +    bool reusable; +  } entry; +} TSParseActionEntry; + +struct TSLanguage { +  uint32_t version; +  uint32_t symbol_count; +  uint32_t alias_count; +  uint32_t token_count; +  uint32_t external_token_count; +  uint32_t state_count; +  uint32_t large_state_count; +  uint32_t production_id_count; +  uint32_t field_count; +  uint16_t max_alias_sequence_length; +  const uint16_t *parse_table; +  const uint16_t *small_parse_table; +  const uint32_t *small_parse_table_map; +  const TSParseActionEntry *parse_actions; +  const char * const *symbol_names; +  const char * const *field_names; +  const TSFieldMapSlice *field_map_slices; +  const TSFieldMapEntry *field_map_entries; +  const TSSymbolMetadata *symbol_metadata; +  const TSSymbol *public_symbol_map; +  const uint16_t *alias_map; +  const TSSymbol *alias_sequences; +  const TSLexMode *lex_modes; +  bool (*lex_fn)(TSLexer *, TSStateId); +  bool (*keyword_lex_fn)(TSLexer *, TSStateId); +  TSSymbol keyword_capture_token; +  struct { +    const bool *states; +    const TSSymbol *symbol_map; +    void *(*create)(void); +    void (*destroy)(void *); +    bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist); +    unsigned (*serialize)(void *, char *); +    void (*deserialize)(void *, const char *, unsigned); +  } external_scanner; +  const TSStateId *primary_state_ids; +}; + +/* + *  Lexer Macros + */ + +#define START_LEXER()           \ +  bool result = false;          \ +  bool skip = false;            \ +  bool eof = false;             \ +  int32_t lookahead;            \ +  goto start;                   \ +  next_state:                   \ +  lexer->advance(lexer, skip);  \ +  start:                        \ +  skip = false;                 \ +  lookahead = lexer->lookahead; + +#define ADVANCE(state_value) \ +  {                          \ +    state = state_value;     \ +    goto next_state;         \ +  } + +#define SKIP(state_value) \ +  {                       \ +    skip = true;          \ +    state = state_value;  \ +    goto next_state;      \ +  } + +#define ACCEPT_TOKEN(symbol_value)     \ +  result = true;                       \ +  lexer->result_symbol = symbol_value; \ +  lexer->mark_end(lexer); + +#define END_STATE() return result; + +/* + *  Parse Table Macros + */ + +#define SMALL_STATE(id) id - LARGE_STATE_COUNT + +#define STATE(id) id + +#define ACTIONS(id) id + +#define SHIFT(state_value)            \ +  {{                                  \ +    .shift = {                        \ +      .type = TSParseActionTypeShift, \ +      .state = state_value            \ +    }                                 \ +  }} + +#define SHIFT_REPEAT(state_value)     \ +  {{                                  \ +    .shift = {                        \ +      .type = TSParseActionTypeShift, \ +      .state = state_value,           \ +      .repetition = true              \ +    }                                 \ +  }} + +#define SHIFT_EXTRA()                 \ +  {{                                  \ +    .shift = {                        \ +      .type = TSParseActionTypeShift, \ +      .extra = true                   \ +    }                                 \ +  }} + +#define REDUCE(symbol_val, child_count_val, ...) \ +  {{                                             \ +    .reduce = {                                  \ +      .type = TSParseActionTypeReduce,           \ +      .symbol = symbol_val,                      \ +      .child_count = child_count_val,            \ +      __VA_ARGS__                                \ +    },                                           \ +  }} + +#define RECOVER()                    \ +  {{                                 \ +    .type = TSParseActionTypeRecover \ +  }} + +#define ACCEPT_INPUT()              \ +  {{                                \ +    .type = TSParseActionTypeAccept \ +  }} + +#ifdef __cplusplus +} +#endif + +#endif  // TREE_SITTER_PARSER_H_  |