Pass edit information into parser function

This commit is contained in:
Max Brunsfeld 2014-03-15 16:55:25 -07:00
parent 464a0e8dad
commit 0d6435e24a
6 changed files with 35 additions and 24 deletions

View file

@ -33,7 +33,7 @@ extern "C" {
#define PARSE_FN() \
static const ts_tree * \
ts_parse(void *data, ts_input input)
ts_parse(void *data, ts_input input, ts_input_edit *edit)
#define LEX_FN() \
static ts_tree * \
@ -59,9 +59,7 @@ ts_parser constructor_name() { \
#define START_PARSER() \
ts_lr_parser *parser = (ts_lr_parser *)data; \
ts_lr_parser_reset(parser); \
parser->lexer.input = input; \
ts_lexer_advance(&parser->lexer); \
ts_lr_parser_initialize(parser, input, edit); \
next_state:
#define LOOKAHEAD_SYM() \
@ -264,11 +262,15 @@ static ts_lr_parser * ts_lr_parser_make() {
return result;
}
static void ts_lr_parser_reset(ts_lr_parser *parser) {
static void ts_lr_parser_initialize(ts_lr_parser *parser, ts_input input, ts_input_edit *edit) {
ts_stack_shrink(&parser->stack, 0);
parser->lookahead = NULL;
parser->next_lookahead = NULL;
input.seek_fn(input.data, 0);
parser->lexer = ts_lexer_make();
parser->lexer.input = input;
ts_lexer_advance(&parser->lexer);
}
static ts_symbol ts_lr_parser_lookahead_sym(const ts_lr_parser *parser) {
@ -283,9 +285,8 @@ static void ts_lr_parser_shift(ts_lr_parser *parser, state_id parse_state) {
}
static void ts_lr_parser_reduce(ts_lr_parser *parser, ts_symbol symbol, int immediate_child_count, const int *collapse_flags) {
ts_tree *lookahead = ts_stack_reduce(&parser->stack, symbol, immediate_child_count, collapse_flags);
parser->next_lookahead = parser->lookahead;
parser->lookahead = lookahead;
parser->lookahead = ts_stack_reduce(&parser->stack, symbol, immediate_child_count, collapse_flags);
}
static int ts_lr_parser_handle_error(ts_lr_parser *parser, size_t count, const ts_symbol *expected_symbols) {

View file

@ -48,14 +48,20 @@ typedef struct {
} ts_input;
typedef struct {
const ts_tree * (* parse_fn)(void *data, ts_input input);
void (* free_fn)(void *data);
const char **symbol_names;
void *data;
} ts_parser;
size_t position;
size_t bytes_inserted;
size_t bytes_removed;
} ts_input_edit;
const ts_tree * ts_parser_parse(ts_parser *, ts_input);
void ts_parser_free(ts_parser *);
typedef struct {
const ts_tree * (* parse_fn)(void *data, ts_input input, ts_input_edit *edit);
void (* free_fn)(void *data);
const char **symbol_names;
void *data;
} ts_parser;
const ts_tree * ts_parser_parse(ts_parser *, ts_input, ts_input_edit *edit);
void ts_parser_free(ts_parser *);
typedef struct ts_document ts_document;
@ -64,7 +70,7 @@ void ts_document_free(ts_document *doc);
void ts_document_set_parser(ts_document *doc, ts_parser parser);
void ts_document_set_input(ts_document *doc, ts_input input);
void ts_document_set_input_string(ts_document *doc, const char *text);
void ts_document_edit(ts_document *doc, size_t position, size_t deleted_bytes, size_t inserted_bytes);
void ts_document_edit(ts_document *doc, ts_input_edit edit);
const ts_tree * ts_document_tree(const ts_document *doc);
const char * ts_document_string(const ts_document *doc);