2016-05-09 14:31:44 -07:00
|
|
|
#include "runtime/language.h"
|
|
|
|
|
#include "runtime/tree.h"
|
2016-10-05 14:02:49 -07:00
|
|
|
#include "runtime/error_costs.h"
|
2016-05-09 14:31:44 -07:00
|
|
|
|
2017-02-19 21:53:49 -08:00
|
|
|
static const TSParseAction SHIFT_ERROR = {
|
2017-07-13 17:17:22 -07:00
|
|
|
.type = TSParseActionTypeShift,
|
2017-07-21 10:17:54 -07:00
|
|
|
.params.state = ERROR_STATE,
|
2016-05-20 20:26:03 -07:00
|
|
|
};
|
|
|
|
|
|
2016-06-21 07:28:04 -07:00
|
|
|
void ts_language_table_entry(const TSLanguage *self, TSStateId state,
|
|
|
|
|
TSSymbol symbol, TableEntry *result) {
|
2016-11-14 12:15:24 -08:00
|
|
|
uint32_t action_index;
|
2016-06-27 14:07:47 -07:00
|
|
|
if (symbol == ts_builtin_sym_error) {
|
2016-10-05 14:02:49 -07:00
|
|
|
if (state == ERROR_STATE) {
|
2016-06-27 14:07:47 -07:00
|
|
|
result->action_count = 1;
|
|
|
|
|
result->is_reusable = false;
|
|
|
|
|
result->depends_on_lookahead = false;
|
2017-02-19 21:53:49 -08:00
|
|
|
result->actions = &SHIFT_ERROR;
|
2016-06-27 14:07:47 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
action_index = 0;
|
|
|
|
|
} else {
|
2016-11-14 08:36:06 -08:00
|
|
|
assert(symbol < self->token_count);
|
2016-06-27 14:07:47 -07:00
|
|
|
action_index = self->parse_table[state * self->symbol_count + symbol];
|
2016-05-09 14:31:44 -07:00
|
|
|
}
|
2015-10-29 12:42:52 -04:00
|
|
|
|
2016-06-21 07:28:04 -07:00
|
|
|
const TSParseActionEntry *entry = &self->parse_actions[action_index];
|
|
|
|
|
result->action_count = entry->count;
|
|
|
|
|
result->is_reusable = entry->reusable;
|
|
|
|
|
result->depends_on_lookahead = entry->depends_on_lookahead;
|
|
|
|
|
result->actions = (const TSParseAction *)(entry + 1);
|
2016-03-07 20:06:46 -08:00
|
|
|
}
|
|
|
|
|
|
2016-11-14 12:15:24 -08:00
|
|
|
uint32_t ts_language_symbol_count(const TSLanguage *language) {
|
2017-07-18 12:01:52 -07:00
|
|
|
return language->symbol_count + language->rename_symbol_count;
|
2015-10-29 12:45:28 -04:00
|
|
|
}
|
|
|
|
|
|
2017-01-31 10:21:47 -08:00
|
|
|
uint32_t ts_language_version(const TSLanguage *language) {
|
|
|
|
|
return language->version;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-07 20:06:46 -08:00
|
|
|
TSSymbolMetadata ts_language_symbol_metadata(const TSLanguage *language,
|
|
|
|
|
TSSymbol symbol) {
|
2017-07-18 12:01:52 -07:00
|
|
|
if (symbol == ts_builtin_sym_error) {
|
2016-03-02 09:55:25 -08:00
|
|
|
return (TSSymbolMetadata){
|
2016-03-07 20:06:46 -08:00
|
|
|
.visible = true, .named = true, .extra = false, .structural = true,
|
2016-03-02 09:55:25 -08:00
|
|
|
};
|
2017-07-18 12:01:52 -07:00
|
|
|
} else {
|
2016-03-02 09:55:25 -08:00
|
|
|
return language->symbol_metadata[symbol];
|
2017-07-18 12:01:52 -07:00
|
|
|
}
|
2016-03-02 09:55:25 -08:00
|
|
|
}
|
|
|
|
|
|
2016-02-19 15:41:30 -08:00
|
|
|
const char *ts_language_symbol_name(const TSLanguage *language, TSSymbol symbol) {
|
2017-07-18 12:01:52 -07:00
|
|
|
if (symbol == ts_builtin_sym_error) {
|
2016-03-02 09:55:25 -08:00
|
|
|
return "ERROR";
|
2017-07-18 12:01:52 -07:00
|
|
|
} else {
|
2016-03-02 09:55:25 -08:00
|
|
|
return language->symbol_names[symbol];
|
2017-07-18 12:01:52 -07:00
|
|
|
}
|
2015-10-29 12:42:52 -04:00
|
|
|
}
|
2017-04-12 09:47:51 -04:00
|
|
|
|
|
|
|
|
TSSymbolType ts_language_symbol_type(const TSLanguage *language, TSSymbol symbol) {
|
|
|
|
|
TSSymbolMetadata metadata = ts_language_symbol_metadata(language, symbol);
|
|
|
|
|
if (metadata.named) {
|
|
|
|
|
return TSSymbolTypeRegular;
|
|
|
|
|
} else if (metadata.visible) {
|
|
|
|
|
return TSSymbolTypeAnonymous;
|
|
|
|
|
} else {
|
|
|
|
|
return TSSymbolTypeAuxiliary;
|
|
|
|
|
}
|
|
|
|
|
}
|