tree-sitter/src/runtime/language.h

74 lines
2.2 KiB
C
Raw Normal View History

#ifndef RUNTIME_LANGUAGE_H_
#define RUNTIME_LANGUAGE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "tree_sitter/parser.h"
#include "runtime/tree.h"
typedef struct {
const TSParseAction *actions;
size_t action_count;
bool is_reusable;
bool depends_on_lookahead;
} TableEntry;
void ts_language_table_entry(const TSLanguage *, TSStateId, TSSymbol,
TableEntry *);
bool ts_language_symbol_is_in_progress(const TSLanguage *, TSStateId, TSSymbol);
static inline const TSParseAction *ts_language_actions(const TSLanguage *self,
TSStateId state,
TSSymbol symbol,
size_t *count) {
TableEntry entry;
ts_language_table_entry(self, state, symbol, &entry);
*count = entry.action_count;
return entry.actions;
}
2016-06-22 14:11:08 -07:00
static inline const TSParseAction *ts_language_last_action(
const TSLanguage *self, TSStateId state, TSSymbol symbol) {
TableEntry entry;
ts_language_table_entry(self, state, symbol, &entry);
if (entry.action_count)
return &entry.actions[entry.action_count - 1];
else
return NULL;
}
static inline TSStateId ts_language_next_state(const TSLanguage *self,
TSStateId state,
TSSymbol symbol) {
if (symbol == ts_builtin_sym_error) {
return 0;
} else if (symbol < self->token_count) {
const TSParseAction *action = ts_language_last_action(self, state, symbol);
if (action && (action->type == TSParseActionTypeShift || action->type == TSParseActionTypeRecover)) {
return action->params.to_state;
} else {
return 0;
}
} else {
return self->parse_table[state * self->symbol_count + symbol];
}
}
static inline bool ts_language_is_reusable(const TSLanguage *self,
TSStateId state, TSSymbol symbol) {
TableEntry entry;
ts_language_table_entry(self, state, symbol, &entry);
return entry.is_reusable;
}
TSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *, TSSymbol);
#ifdef __cplusplus
}
#endif
#endif // RUNTIME_LANGUAGE_H_