fix: improve error recovery

This commit is contained in:
ObserverOfTime 2024-04-13 16:44:23 +03:00
parent 3975596d84
commit ee09311821
No known key found for this signature in database
GPG key ID: 8A2DEA1DBAEBCA9E
5 changed files with 655 additions and 602 deletions

View file

@ -64,6 +64,8 @@ module.exports = grammar({
$._bl, $._bl,
$.comment, $.comment,
$._err_rec,
], ],
extras: $ => [$.comment], extras: $ => [$.comment],

4
src/grammar.json generated
View file

@ -6950,6 +6950,10 @@
{ {
"type": "SYMBOL", "type": "SYMBOL",
"name": "comment" "name": "comment"
},
{
"type": "SYMBOL",
"name": "_err_rec"
} }
], ],
"inline": [ "inline": [

1107
src/parser.c generated

File diff suppressed because it is too large Load diff

View file

@ -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() {

View file

@ -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() \