fix: improve error recovery
This commit is contained in:
parent
3975596d84
commit
ee09311821
|
@ -64,6 +64,8 @@ module.exports = grammar({
|
||||||
|
|
||||||
$._bl,
|
$._bl,
|
||||||
$.comment,
|
$.comment,
|
||||||
|
|
||||||
|
$._err_rec,
|
||||||
],
|
],
|
||||||
|
|
||||||
extras: $ => [$.comment],
|
extras: $ => [$.comment],
|
||||||
|
|
4
src/grammar.json
generated
4
src/grammar.json
generated
|
@ -6950,6 +6950,10 @@
|
||||||
{
|
{
|
||||||
"type": "SYMBOL",
|
"type": "SYMBOL",
|
||||||
"name": "comment"
|
"name": "comment"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "_err_rec"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inline": [
|
"inline": [
|
||||||
|
|
1107
src/parser.c
generated
1107
src/parser.c
generated
File diff suppressed because it is too large
Load diff
|
@ -13,53 +13,55 @@
|
||||||
// clang-format off
|
// clang-format off
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
END_OF_FILE,
|
END_OF_FILE,
|
||||||
|
|
||||||
S_DIR_YML_BGN, R_DIR_YML_VER,
|
S_DIR_YML_BGN, R_DIR_YML_VER,
|
||||||
S_DIR_TAG_BGN, R_DIR_TAG_HDL, R_DIR_TAG_PFX,
|
S_DIR_TAG_BGN, R_DIR_TAG_HDL, R_DIR_TAG_PFX,
|
||||||
S_DIR_RSV_BGN, R_DIR_RSV_PRM,
|
S_DIR_RSV_BGN, R_DIR_RSV_PRM,
|
||||||
S_DRS_END,
|
S_DRS_END,
|
||||||
S_DOC_END,
|
S_DOC_END,
|
||||||
R_BLK_SEQ_BGN, BR_BLK_SEQ_BGN, B_BLK_SEQ_BGN,
|
R_BLK_SEQ_BGN, BR_BLK_SEQ_BGN, B_BLK_SEQ_BGN,
|
||||||
R_BLK_KEY_BGN, BR_BLK_KEY_BGN, B_BLK_KEY_BGN,
|
R_BLK_KEY_BGN, BR_BLK_KEY_BGN, B_BLK_KEY_BGN,
|
||||||
R_BLK_VAL_BGN, BR_BLK_VAL_BGN, B_BLK_VAL_BGN,
|
R_BLK_VAL_BGN, BR_BLK_VAL_BGN, B_BLK_VAL_BGN,
|
||||||
R_BLK_IMP_BGN,
|
R_BLK_IMP_BGN,
|
||||||
R_BLK_LIT_BGN, BR_BLK_LIT_BGN,
|
R_BLK_LIT_BGN, BR_BLK_LIT_BGN,
|
||||||
R_BLK_FLD_BGN, BR_BLK_FLD_BGN,
|
R_BLK_FLD_BGN, BR_BLK_FLD_BGN,
|
||||||
BR_BLK_STR_CTN,
|
BR_BLK_STR_CTN,
|
||||||
R_FLW_SEQ_BGN, BR_FLW_SEQ_BGN, B_FLW_SEQ_BGN,
|
R_FLW_SEQ_BGN, BR_FLW_SEQ_BGN, B_FLW_SEQ_BGN,
|
||||||
R_FLW_SEQ_END, BR_FLW_SEQ_END, B_FLW_SEQ_END,
|
R_FLW_SEQ_END, BR_FLW_SEQ_END, B_FLW_SEQ_END,
|
||||||
R_FLW_MAP_BGN, BR_FLW_MAP_BGN, B_FLW_MAP_BGN,
|
R_FLW_MAP_BGN, BR_FLW_MAP_BGN, B_FLW_MAP_BGN,
|
||||||
R_FLW_MAP_END, BR_FLW_MAP_END, B_FLW_MAP_END,
|
R_FLW_MAP_END, BR_FLW_MAP_END, B_FLW_MAP_END,
|
||||||
R_FLW_SEP_BGN, BR_FLW_SEP_BGN,
|
R_FLW_SEP_BGN, BR_FLW_SEP_BGN,
|
||||||
R_FLW_KEY_BGN, BR_FLW_KEY_BGN,
|
R_FLW_KEY_BGN, BR_FLW_KEY_BGN,
|
||||||
R_FLW_JSV_BGN, BR_FLW_JSV_BGN,
|
R_FLW_JSV_BGN, BR_FLW_JSV_BGN,
|
||||||
R_FLW_NJV_BGN, BR_FLW_NJV_BGN,
|
R_FLW_NJV_BGN, BR_FLW_NJV_BGN,
|
||||||
R_DQT_STR_BGN, BR_DQT_STR_BGN, B_DQT_STR_BGN,
|
R_DQT_STR_BGN, BR_DQT_STR_BGN, B_DQT_STR_BGN,
|
||||||
R_DQT_STR_CTN, BR_DQT_STR_CTN,
|
R_DQT_STR_CTN, BR_DQT_STR_CTN,
|
||||||
R_DQT_ESC_NWL, BR_DQT_ESC_NWL,
|
R_DQT_ESC_NWL, BR_DQT_ESC_NWL,
|
||||||
R_DQT_ESC_SEQ, BR_DQT_ESC_SEQ,
|
R_DQT_ESC_SEQ, BR_DQT_ESC_SEQ,
|
||||||
R_DQT_STR_END, BR_DQT_STR_END,
|
R_DQT_STR_END, BR_DQT_STR_END,
|
||||||
R_SQT_STR_BGN, BR_SQT_STR_BGN, B_SQT_STR_BGN,
|
R_SQT_STR_BGN, BR_SQT_STR_BGN, B_SQT_STR_BGN,
|
||||||
R_SQT_STR_CTN, BR_SQT_STR_CTN,
|
R_SQT_STR_CTN, BR_SQT_STR_CTN,
|
||||||
R_SQT_ESC_SQT, BR_SQT_ESC_SQT,
|
R_SQT_ESC_SQT, BR_SQT_ESC_SQT,
|
||||||
R_SQT_STR_END, BR_SQT_STR_END,
|
R_SQT_STR_END, BR_SQT_STR_END,
|
||||||
|
|
||||||
R_SGL_PLN_NUL_BLK, BR_SGL_PLN_NUL_BLK, B_SGL_PLN_NUL_BLK, R_SGL_PLN_NUL_FLW, BR_SGL_PLN_NUL_FLW,
|
R_SGL_PLN_NUL_BLK, BR_SGL_PLN_NUL_BLK, B_SGL_PLN_NUL_BLK, R_SGL_PLN_NUL_FLW, BR_SGL_PLN_NUL_FLW,
|
||||||
R_SGL_PLN_BOL_BLK, BR_SGL_PLN_BOL_BLK, B_SGL_PLN_BOL_BLK, R_SGL_PLN_BOL_FLW, BR_SGL_PLN_BOL_FLW,
|
R_SGL_PLN_BOL_BLK, BR_SGL_PLN_BOL_BLK, B_SGL_PLN_BOL_BLK, R_SGL_PLN_BOL_FLW, BR_SGL_PLN_BOL_FLW,
|
||||||
R_SGL_PLN_INT_BLK, BR_SGL_PLN_INT_BLK, B_SGL_PLN_INT_BLK, R_SGL_PLN_INT_FLW, BR_SGL_PLN_INT_FLW,
|
R_SGL_PLN_INT_BLK, BR_SGL_PLN_INT_BLK, B_SGL_PLN_INT_BLK, R_SGL_PLN_INT_FLW, BR_SGL_PLN_INT_FLW,
|
||||||
R_SGL_PLN_FLT_BLK, BR_SGL_PLN_FLT_BLK, B_SGL_PLN_FLT_BLK, R_SGL_PLN_FLT_FLW, BR_SGL_PLN_FLT_FLW,
|
R_SGL_PLN_FLT_BLK, BR_SGL_PLN_FLT_BLK, B_SGL_PLN_FLT_BLK, R_SGL_PLN_FLT_FLW, BR_SGL_PLN_FLT_FLW,
|
||||||
R_SGL_PLN_STR_BLK, BR_SGL_PLN_STR_BLK, B_SGL_PLN_STR_BLK, R_SGL_PLN_STR_FLW, BR_SGL_PLN_STR_FLW,
|
R_SGL_PLN_STR_BLK, BR_SGL_PLN_STR_BLK, B_SGL_PLN_STR_BLK, R_SGL_PLN_STR_FLW, BR_SGL_PLN_STR_FLW,
|
||||||
|
|
||||||
R_MTL_PLN_STR_BLK, BR_MTL_PLN_STR_BLK,
|
R_MTL_PLN_STR_BLK, BR_MTL_PLN_STR_BLK,
|
||||||
R_MTL_PLN_STR_FLW, BR_MTL_PLN_STR_FLW,
|
R_MTL_PLN_STR_FLW, BR_MTL_PLN_STR_FLW,
|
||||||
|
|
||||||
R_TAG, BR_TAG, B_TAG,
|
R_TAG, BR_TAG, B_TAG,
|
||||||
R_ACR_BGN, BR_ACR_BGN, B_ACR_BGN, R_ACR_CTN,
|
R_ACR_BGN, BR_ACR_BGN, B_ACR_BGN, R_ACR_CTN,
|
||||||
R_ALS_BGN, BR_ALS_BGN, B_ALS_BGN, R_ALS_CTN,
|
R_ALS_BGN, BR_ALS_BGN, B_ALS_BGN, R_ALS_CTN,
|
||||||
|
|
||||||
BL,
|
BL,
|
||||||
COMMENT,
|
COMMENT,
|
||||||
|
|
||||||
|
ERR_REC,
|
||||||
} TokenType;
|
} TokenType;
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
@ -1355,7 +1357,7 @@ static bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return !valid_symbols[ERR_REC];
|
||||||
}
|
}
|
||||||
|
|
||||||
void *tree_sitter_yaml_external_scanner_create() {
|
void *tree_sitter_yaml_external_scanner_create() {
|
||||||
|
|
56
src/tree_sitter/parser.h
generated
56
src/tree_sitter/parser.h
generated
|
@ -86,6 +86,11 @@ typedef union {
|
||||||
} entry;
|
} entry;
|
||||||
} TSParseActionEntry;
|
} TSParseActionEntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t start;
|
||||||
|
int32_t end;
|
||||||
|
} TSCharacterRange;
|
||||||
|
|
||||||
struct TSLanguage {
|
struct TSLanguage {
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
uint32_t symbol_count;
|
uint32_t symbol_count;
|
||||||
|
@ -125,6 +130,24 @@ struct TSLanguage {
|
||||||
const TSStateId *primary_state_ids;
|
const TSStateId *primary_state_ids;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline bool set_contains(TSCharacterRange *ranges, uint32_t len, int32_t lookahead) {
|
||||||
|
uint32_t index = 0;
|
||||||
|
uint32_t size = len - index;
|
||||||
|
while (size > 1) {
|
||||||
|
uint32_t half_size = size / 2;
|
||||||
|
uint32_t mid_index = index + half_size;
|
||||||
|
TSCharacterRange *range = &ranges[mid_index];
|
||||||
|
if (lookahead >= range->start && lookahead <= range->end) {
|
||||||
|
return true;
|
||||||
|
} else if (lookahead > range->end) {
|
||||||
|
index = mid_index;
|
||||||
|
}
|
||||||
|
size -= half_size;
|
||||||
|
}
|
||||||
|
TSCharacterRange *range = &ranges[index];
|
||||||
|
return (lookahead >= range->start && lookahead <= range->end);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lexer Macros
|
* Lexer Macros
|
||||||
*/
|
*/
|
||||||
|
@ -138,9 +161,8 @@ struct TSLanguage {
|
||||||
#define START_LEXER() \
|
#define START_LEXER() \
|
||||||
bool result = false; \
|
bool result = false; \
|
||||||
bool skip = false; \
|
bool skip = false; \
|
||||||
UNUSED \
|
UNUSED bool eof = false; \
|
||||||
bool eof = false; \
|
UNUSED int32_t lookahead; \
|
||||||
int32_t lookahead; \
|
|
||||||
goto start; \
|
goto start; \
|
||||||
next_state: \
|
next_state: \
|
||||||
lexer->advance(lexer, skip); \
|
lexer->advance(lexer, skip); \
|
||||||
|
@ -154,6 +176,17 @@ struct TSLanguage {
|
||||||
goto next_state; \
|
goto next_state; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ADVANCE_MAP(...) \
|
||||||
|
{ \
|
||||||
|
static const uint16_t map[] = { __VA_ARGS__ }; \
|
||||||
|
for (uint32_t i = 0; i < sizeof(map) / sizeof(map[0]); i += 2) { \
|
||||||
|
if (map[i] == lookahead) { \
|
||||||
|
state = map[i + 1]; \
|
||||||
|
goto next_state; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
#define SKIP(state_value) \
|
#define SKIP(state_value) \
|
||||||
{ \
|
{ \
|
||||||
skip = true; \
|
skip = true; \
|
||||||
|
@ -203,14 +236,15 @@ struct TSLanguage {
|
||||||
} \
|
} \
|
||||||
}}
|
}}
|
||||||
|
|
||||||
#define REDUCE(symbol_val, child_count_val, ...) \
|
#define REDUCE(symbol_name, children, precedence, prod_id) \
|
||||||
{{ \
|
{{ \
|
||||||
.reduce = { \
|
.reduce = { \
|
||||||
.type = TSParseActionTypeReduce, \
|
.type = TSParseActionTypeReduce, \
|
||||||
.symbol = symbol_val, \
|
.symbol = symbol_name, \
|
||||||
.child_count = child_count_val, \
|
.child_count = children, \
|
||||||
__VA_ARGS__ \
|
.dynamic_precedence = precedence, \
|
||||||
}, \
|
.production_id = prod_id \
|
||||||
|
} \
|
||||||
}}
|
}}
|
||||||
|
|
||||||
#define RECOVER() \
|
#define RECOVER() \
|
||||||
|
|
Loading…
Reference in a new issue