| @ -1,67 +0,0 @@ | |||
| #ifndef TREE_SITTER_COMPILER_H_ | |||
| #define TREE_SITTER_COMPILER_H_ | |||
| #include <memory> | |||
| #include <string> | |||
| #include <utility> | |||
| #include <vector> | |||
| namespace tree_sitter { | |||
| class Rule; | |||
| typedef std::shared_ptr<Rule> rule_ptr; | |||
| enum Associativity { | |||
| AssociativityNone, | |||
| AssociativityLeft, | |||
| AssociativityRight, | |||
| }; | |||
| rule_ptr blank(); | |||
| rule_ptr choice(const std::vector<rule_ptr> &); | |||
| rule_ptr repeat(const rule_ptr &); | |||
| rule_ptr seq(const std::vector<rule_ptr> &); | |||
| rule_ptr sym(const std::string &); | |||
| rule_ptr pattern(const std::string &); | |||
| rule_ptr str(const std::string &); | |||
| rule_ptr err(const rule_ptr &); | |||
| rule_ptr prec(int precedence, const rule_ptr &); | |||
| rule_ptr prec(int precedence, const rule_ptr &, Associativity); | |||
| rule_ptr token(const rule_ptr &rule); | |||
| class Grammar { | |||
| const std::vector<std::pair<std::string, rule_ptr>> rules_; | |||
| std::vector<rule_ptr> ubiquitous_tokens_; | |||
| std::vector<std::vector<std::string>> expected_conflicts_; | |||
| public: | |||
| explicit Grammar(const std::vector<std::pair<std::string, rule_ptr>> &); | |||
| Grammar &ubiquitous_tokens(const std::vector<rule_ptr> &); | |||
| Grammar &expected_conflicts(const std::vector<std::vector<std::string>> &); | |||
| const std::vector<std::pair<std::string, rule_ptr>> &rules() const; | |||
| const std::vector<rule_ptr> &ubiquitous_tokens() const; | |||
| const std::vector<std::vector<std::string>> &expected_conflicts() const; | |||
| }; | |||
| enum GrammarErrorType { | |||
| GrammarErrorTypeRegex, | |||
| GrammarErrorTypeUndefinedSymbol, | |||
| GrammarErrorTypeInvalidUbiquitousToken, | |||
| GrammarErrorTypeLexConflict, | |||
| GrammarErrorTypeParseConflict, | |||
| }; | |||
| class GrammarError { | |||
| public: | |||
| GrammarError(GrammarErrorType type, std::string message); | |||
| bool operator==(const GrammarError &other) const; | |||
| GrammarErrorType type; | |||
| std::string message; | |||
| }; | |||
| std::pair<std::string, const GrammarError *> compile(const Grammar &, | |||
| std::string); | |||
| } // namespace tree_sitter | |||
| #endif // TREE_SITTER_COMPILER_H_ | |||
| @ -1,175 +0,0 @@ | |||
| #ifndef TREE_SITTER_PARSER_H_ | |||
| #define TREE_SITTER_PARSER_H_ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include <stdint.h> | |||
| #include <stdbool.h> | |||
| #include "tree_sitter/runtime.h" | |||
| #define ts_lex_state_error 0 | |||
| #define TS_DEBUG_BUFFER_SIZE 512 | |||
| typedef struct TSTree TSTree; | |||
| typedef unsigned short TSStateId; | |||
| typedef enum { | |||
| TSNodeTypeHidden, | |||
| TSNodeTypeAnonymous, | |||
| TSNodeTypeNamed, | |||
| } TSNodeType; | |||
| typedef struct TSLexer { | |||
| // Public | |||
| void (*start_fn)(struct TSLexer *, TSStateId); | |||
| void (*start_token_fn)(struct TSLexer *); | |||
| bool (*advance_fn)(struct TSLexer *, TSStateId); | |||
| TSTree *(*accept_fn)(struct TSLexer *, TSSymbol, TSNodeType, const char *); | |||
| // Private | |||
| const char *chunk; | |||
| size_t chunk_start; | |||
| size_t chunk_size; | |||
| TSLength current_position; | |||
| TSLength token_end_position; | |||
| TSLength token_start_position; | |||
| size_t lookahead_size; | |||
| int32_t lookahead; | |||
| TSInput input; | |||
| TSDebugger debugger; | |||
| char debug_buffer[TS_DEBUG_BUFFER_SIZE]; | |||
| } TSLexer; | |||
| typedef enum { | |||
| TSParseActionTypeError = 1, | |||
| TSParseActionTypeShift, | |||
| TSParseActionTypeShiftExtra, | |||
| TSParseActionTypeReduce, | |||
| TSParseActionTypeReduceExtra, | |||
| TSParseActionTypeReduceFragile, | |||
| TSParseActionTypeAccept, | |||
| } TSParseActionType; | |||
| typedef struct { | |||
| TSParseActionType type; | |||
| union { | |||
| TSStateId to_state; | |||
| struct { | |||
| TSSymbol symbol; | |||
| unsigned short child_count; | |||
| }; | |||
| } data; | |||
| } TSParseAction; | |||
| struct TSLanguage { | |||
| size_t symbol_count; | |||
| const char **symbol_names; | |||
| const TSNodeType *node_types; | |||
| const TSParseAction **parse_table; | |||
| const TSStateId *lex_states; | |||
| TSTree *(*lex_fn)(TSLexer *, TSStateId); | |||
| }; | |||
| /* | |||
| * Lexer Macros | |||
| */ | |||
| #define START_LEXER() \ | |||
| const bool error_mode = (lex_state == ts_lex_state_error); \ | |||
| lexer->start_fn(lexer, lex_state); \ | |||
| int32_t lookahead; \ | |||
| next_state: \ | |||
| lookahead = lexer->lookahead; | |||
| #define START_TOKEN() lexer->start_token_fn(lexer); | |||
| #define GO_TO_STATE(state_index) \ | |||
| { \ | |||
| lex_state = state_index; \ | |||
| goto next_state; \ | |||
| } | |||
| #define ADVANCE(state_index) \ | |||
| { \ | |||
| lexer->advance_fn(lexer, state_index); \ | |||
| GO_TO_STATE(state_index); \ | |||
| } | |||
| #define ACCEPT_TOKEN(symbol) \ | |||
| return lexer->accept_fn(lexer, symbol, ts_node_types[symbol], \ | |||
| ts_symbol_names[symbol]); | |||
| #define LEX_ERROR() \ | |||
| if (error_mode) { \ | |||
| if (lex_state == ts_lex_state_error) \ | |||
| ADVANCE(ts_lex_state_error) \ | |||
| else \ | |||
| GO_TO_STATE(ts_lex_state_error) \ | |||
| } else { \ | |||
| ACCEPT_TOKEN(ts_builtin_sym_error) \ | |||
| } | |||
| /* | |||
| * Parse Table Macros | |||
| */ | |||
| #define ACTIONS(...) \ | |||
| (TSParseAction[]) { \ | |||
| __VA_ARGS__, { \ | |||
| .type = 0 \ | |||
| } \ | |||
| } | |||
| #define SHIFT(to_state_value) \ | |||
| { \ | |||
| .type = TSParseActionTypeShift, .data = {.to_state = to_state_value } \ | |||
| } | |||
| #define SHIFT_EXTRA() \ | |||
| { .type = TSParseActionTypeShiftExtra } | |||
| #define REDUCE_EXTRA(symbol_val) \ | |||
| { \ | |||
| .type = TSParseActionTypeReduceExtra, .data = {.symbol = symbol_val } \ | |||
| } | |||
| #define REDUCE(symbol_val, child_count_val) \ | |||
| { \ | |||
| .type = TSParseActionTypeReduce, \ | |||
| .data = {.symbol = symbol_val, .child_count = child_count_val } \ | |||
| } | |||
| #define REDUCE_FRAGILE(symbol_val, child_count_val) \ | |||
| { \ | |||
| .type = TSParseActionTypeReduceFragile, \ | |||
| .data = {.symbol = symbol_val, .child_count = child_count_val } \ | |||
| } | |||
| #define ACCEPT_INPUT() \ | |||
| { .type = TSParseActionTypeAccept } | |||
| #define EXPORT_LANGUAGE(language_name) \ | |||
| static TSLanguage language = { \ | |||
| .symbol_count = SYMBOL_COUNT, \ | |||
| .node_types = ts_node_types, \ | |||
| .parse_table = (const TSParseAction **)ts_parse_actions, \ | |||
| .lex_states = ts_lex_states, \ | |||
| .symbol_names = ts_symbol_names, \ | |||
| .lex_fn = ts_lex, \ | |||
| }; \ | |||
| \ | |||
| const TSLanguage *language_name() { \ | |||
| return &language; \ | |||
| } | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif // TREE_SITTER_PARSER_H_ | |||
| @ -1,87 +0,0 @@ | |||
| #ifndef TREE_SITTER_RUNTIME_H_ | |||
| #define TREE_SITTER_RUNTIME_H_ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include <stdlib.h> | |||
| #include <stdbool.h> | |||
| typedef struct { | |||
| size_t bytes; | |||
| size_t chars; | |||
| } TSLength; | |||
| typedef struct { | |||
| void *payload; | |||
| const char *(*read_fn)(void *payload, size_t *bytes_read); | |||
| int (*seek_fn)(void *payload, TSLength position); | |||
| } TSInput; | |||
| typedef enum { | |||
| TSDebugTypeParse, | |||
| TSDebugTypeLex, | |||
| } TSDebugType; | |||
| typedef struct { | |||
| void *payload; | |||
| void (*debug_fn)(void *payload, TSDebugType, const char *); | |||
| } TSDebugger; | |||
| typedef struct { | |||
| size_t position; | |||
| size_t chars_inserted; | |||
| size_t chars_removed; | |||
| } TSInputEdit; | |||
| typedef struct { | |||
| const void *data; | |||
| TSLength offset; | |||
| } TSNode; | |||
| typedef unsigned short TSSymbol; | |||
| typedef struct TSLanguage TSLanguage; | |||
| typedef struct TSDocument TSDocument; | |||
| TSLength ts_node_pos(TSNode); | |||
| TSLength ts_node_size(TSNode); | |||
| TSSymbol ts_node_symbol(TSNode); | |||
| const char *ts_node_name(TSNode, const TSDocument *); | |||
| const char *ts_node_string(TSNode, const TSDocument *); | |||
| bool ts_node_eq(TSNode, TSNode); | |||
| bool ts_node_is_named(TSNode); | |||
| TSNode ts_node_parent(TSNode); | |||
| TSNode ts_node_child(TSNode, size_t); | |||
| TSNode ts_node_named_child(TSNode, size_t); | |||
| size_t ts_node_child_count(TSNode); | |||
| size_t ts_node_named_child_count(TSNode); | |||
| TSNode ts_node_next_sibling(TSNode); | |||
| TSNode ts_node_next_named_sibling(TSNode); | |||
| TSNode ts_node_prev_sibling(TSNode); | |||
| TSNode ts_node_prev_named_sibling(TSNode); | |||
| TSNode ts_node_descendent_for_range(TSNode, size_t, size_t); | |||
| TSNode ts_node_named_descendent_for_range(TSNode, size_t, size_t); | |||
| TSDocument *ts_document_make(); | |||
| void ts_document_free(TSDocument *); | |||
| const TSLanguage * ts_document_language(TSDocument *); | |||
| void ts_document_set_language(TSDocument *, const TSLanguage *); | |||
| TSInput ts_document_input(TSDocument *); | |||
| void ts_document_set_input(TSDocument *, TSInput); | |||
| void ts_document_set_input_string(TSDocument *, const char *); | |||
| void ts_document_edit(TSDocument *, TSInputEdit); | |||
| TSDebugger ts_document_debugger(const TSDocument *); | |||
| void ts_document_set_debugger(TSDocument *, TSDebugger); | |||
| TSNode ts_document_root_node(const TSDocument *); | |||
| size_t ts_document_parse_count(const TSDocument *); | |||
| #define ts_builtin_sym_error 0 | |||
| #define ts_builtin_sym_end 1 | |||
| #define ts_builtin_sym_start 2 | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif // TREE_SITTER_RUNTIME_H_ | |||