2014-07-30 23:40:02 -07:00
|
|
|
#ifndef RUNTIME_STACK_H_
|
|
|
|
|
#define RUNTIME_STACK_H_
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "tree_sitter/parser.h"
|
|
|
|
|
|
2014-08-31 12:10:31 -07:00
|
|
|
typedef struct {
|
|
|
|
|
TSTree *node;
|
|
|
|
|
TSStateId state;
|
|
|
|
|
} TSStackEntry;
|
|
|
|
|
|
2014-07-30 23:40:02 -07:00
|
|
|
typedef struct {
|
|
|
|
|
size_t size;
|
2014-08-30 21:39:55 -07:00
|
|
|
size_t capacity;
|
2014-08-31 12:10:31 -07:00
|
|
|
TSStackEntry *entries;
|
2014-07-30 23:40:02 -07:00
|
|
|
} TSStack;
|
|
|
|
|
|
|
|
|
|
TSStack ts_stack_make();
|
|
|
|
|
void ts_stack_delete(TSStack *);
|
|
|
|
|
void ts_stack_shrink(TSStack *stack, size_t new_size);
|
|
|
|
|
void ts_stack_push(TSStack *stack, TSStateId state, TSTree *node);
|
|
|
|
|
TSStateId ts_stack_top_state(const TSStack *stack);
|
|
|
|
|
TSTree *ts_stack_top_node(const TSStack *stack);
|
2014-09-26 16:15:07 -07:00
|
|
|
TSLength ts_stack_right_position(const TSStack *stack);
|
2014-07-30 23:40:02 -07:00
|
|
|
|
2014-08-31 12:10:31 -07:00
|
|
|
#define TS_STACK_FROM_TOP(stack, entry, index) \
|
|
|
|
|
size_t index = stack.size - 1; \
|
2014-09-01 21:32:29 -07:00
|
|
|
(void) index; \
|
2014-08-31 12:10:31 -07:00
|
|
|
for (TSStackEntry *entry = stack.entries + stack.size - 1; \
|
|
|
|
|
entry >= stack.entries; entry-- && index--)
|
|
|
|
|
|
2014-07-30 23:40:02 -07:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif // RUNTIME_STACK_H_
|