tree-sitter/src/runtime/stack.h

129 lines
3.1 KiB
C
Raw Normal View History

2015-05-25 20:21:13 -07:00
#ifndef RUNTIME_PARSE_STACK_H_
#define RUNTIME_PARSE_STACK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "tree_sitter/parser.h"
2016-02-17 20:41:29 -08:00
#include "runtime/array.h"
#include "runtime/tree.h"
#include <stdio.h>
2015-05-25 20:21:13 -07:00
2015-09-18 18:04:52 -07:00
typedef struct Stack Stack;
2015-05-25 20:21:13 -07:00
typedef unsigned int StackVersion;
#define STACK_VERSION_NONE ((StackVersion)-1)
2016-04-04 12:25:57 -07:00
2015-06-03 09:44:13 -07:00
typedef struct {
TreeArray trees;
2016-04-04 12:25:57 -07:00
StackVersion version;
2016-03-03 10:16:10 -08:00
} StackSlice;
2015-06-03 09:44:13 -07:00
typedef Array(StackSlice) StackSliceArray;
typedef struct {
enum {
StackPopFailed,
StackPopStoppedAtError,
StackPopSucceeded,
} status;
StackSliceArray slices;
} StackPopResult;
enum {
StackIterateNone,
StackIterateStop = 1 << 0,
StackIteratePop = 1 << 1,
};
typedef unsigned int StackIterateAction;
typedef StackIterateAction (*StackIterateCallback)(void *, TSStateId state,
TreeArray *trees,
size_t tree_count,
bool is_done,
bool is_pending);
2015-06-03 09:44:13 -07:00
/*
2015-08-16 19:53:34 -07:00
* Create a parse stack.
2015-06-03 09:44:13 -07:00
*/
Stack *ts_stack_new();
2015-06-03 09:44:13 -07:00
/*
* Release any resources reserved by a parse stack.
*/
2015-09-18 18:04:52 -07:00
void ts_stack_delete(Stack *);
2015-05-25 20:21:13 -07:00
2015-06-03 09:44:13 -07:00
/*
2016-04-04 12:25:57 -07:00
* Get the stack's current number of versions.
2015-06-03 09:44:13 -07:00
*/
size_t ts_stack_version_count(const Stack *);
2015-05-25 20:21:13 -07:00
2015-06-03 09:44:13 -07:00
/*
2016-04-04 12:25:57 -07:00
* Get the state at the top of the given version of the stack. If the stack is
* empty, this returns the initial state (0).
2015-06-03 09:44:13 -07:00
*/
2016-04-04 12:25:57 -07:00
TSStateId ts_stack_top_state(const Stack *, StackVersion);
2015-06-03 09:44:13 -07:00
/*
2016-04-04 12:25:57 -07:00
* Get the position at the top of the given version of the stack. If the stack
* is empty, this returns zero.
*/
2016-04-04 12:25:57 -07:00
TSLength ts_stack_top_position(const Stack *, StackVersion);
2015-06-03 09:44:13 -07:00
/*
2016-04-04 12:25:57 -07:00
* Push a tree and state onto the given head of the stack. This could cause
* the version to merge with an existing version.
2015-06-03 09:44:13 -07:00
*/
bool ts_stack_push(Stack *, StackVersion, TSTree *, bool, TSStateId);
2015-06-03 09:44:13 -07:00
/*
2016-04-04 12:25:57 -07:00
* Pop the given number of entries from the given version of the stack. This
* operation can increase the number of stack versions by revealing multiple
* versions which had previously been merged. It returns a struct that
* indicates the index of each revealed version and the trees removed from that
* version.
2015-06-03 09:44:13 -07:00
*/
2016-04-04 12:25:57 -07:00
StackPopResult ts_stack_pop_count(Stack *, StackVersion, size_t count);
StackPopResult ts_stack_iterate(Stack *, StackVersion, StackIterateCallback,
void *);
2016-04-04 12:25:57 -07:00
StackPopResult ts_stack_pop_pending(Stack *, StackVersion);
StackPopResult ts_stack_pop_all(Stack *, StackVersion);
StackVersion ts_stack_split(Stack *, StackVersion);
bool ts_stack_merge(Stack *, StackVersion, StackVersion);
void ts_stack_merge_from(Stack *, StackVersion);
void ts_stack_merge_all(Stack *);
bool ts_stack_condense(Stack *);
void ts_stack_renumber_version(Stack *, StackVersion, StackVersion);
2015-05-25 20:21:13 -07:00
StackVersion ts_stack_duplicate_version(Stack *, StackVersion);
/*
2016-04-04 12:25:57 -07:00
* Remove the given version from the stack.
*/
2016-04-04 12:25:57 -07:00
void ts_stack_remove_version(Stack *, StackVersion);
/*
* Remove all entries from the stack.
*/
2015-09-18 18:04:52 -07:00
void ts_stack_clear(Stack *);
bool ts_stack_print_dot_graph(Stack *, const char **, FILE *);
2015-05-25 20:21:13 -07:00
#ifdef __cplusplus
}
#endif
#endif // RUNTIME_PARSE_STACK_H_