Files
wehub-resource-sync 41cb1c0170
OpenSSF Scorecard / scorecard (push) Failing after 0s
DCO / dco (push) Failing after 0s
CodeQL SAST / analyze (push) Failing after 1s
Deploy Pages / deploy (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:28:05 +08:00

1415 lines
50 KiB
C
Generated

#include "tree_sitter/array.h"
#include "tree_sitter/parser.h"
#define _str(x) #x
#define _file(x) _str(schema.x.c)
#ifndef YAML_SCHEMA
#define YAML_SCHEMA core
#endif
#include _file(YAML_SCHEMA)
// clang-format off
typedef enum {
END_OF_FILE,
S_DIR_YML_BGN, R_DIR_YML_VER,
S_DIR_TAG_BGN, R_DIR_TAG_HDL, R_DIR_TAG_PFX,
S_DIR_RSV_BGN, R_DIR_RSV_PRM,
S_DRS_END,
S_DOC_END,
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_VAL_BGN, BR_BLK_VAL_BGN, B_BLK_VAL_BGN,
R_BLK_IMP_BGN,
R_BLK_LIT_BGN, BR_BLK_LIT_BGN,
R_BLK_FLD_BGN, BR_BLK_FLD_BGN,
BR_BLK_STR_CTN,
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_MAP_BGN, BR_FLW_MAP_BGN, B_FLW_MAP_BGN,
R_FLW_MAP_END, BR_FLW_MAP_END, B_FLW_MAP_END,
R_FLW_SEP_BGN, BR_FLW_SEP_BGN,
R_FLW_KEY_BGN, BR_FLW_KEY_BGN,
R_FLW_JSV_BGN, BR_FLW_JSV_BGN,
R_FLW_NJV_BGN, BR_FLW_NJV_BGN,
R_DQT_STR_BGN, BR_DQT_STR_BGN, B_DQT_STR_BGN,
R_DQT_STR_CTN, BR_DQT_STR_CTN,
R_DQT_ESC_NWL, BR_DQT_ESC_NWL,
R_DQT_ESC_SEQ, BR_DQT_ESC_SEQ,
R_DQT_STR_END, BR_DQT_STR_END,
R_SQT_STR_BGN, BR_SQT_STR_BGN, B_SQT_STR_BGN,
R_SQT_STR_CTN, BR_SQT_STR_CTN,
R_SQT_ESC_SQT, BR_SQT_ESC_SQT,
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_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_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_TMS_BLK, BR_SGL_PLN_TMS_BLK, B_SGL_PLN_TMS_BLK, R_SGL_PLN_TMS_FLW, BR_SGL_PLN_TMS_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_FLW, BR_MTL_PLN_STR_FLW,
R_TAG, BR_TAG, B_TAG,
R_ACR_BGN, BR_ACR_BGN, B_ACR_BGN, R_ACR_CTN,
R_ALS_BGN, BR_ALS_BGN, B_ALS_BGN, R_ALS_CTN,
BL,
COMMENT,
ERR_REC,
} TokenType;
// clang-format on
#define SCN_SUCC 1
#define SCN_STOP 0
#define SCN_FAIL (-1)
#define IND_ROT 'r'
#define IND_MAP 'm'
#define IND_SEQ 'q'
#define IND_STR 's'
#define RET_SYM(RESULT_SYMBOL) \
{ \
flush(scanner); \
lexer->result_symbol = RESULT_SYMBOL; \
return true; \
}
#define POP_IND() \
{ \
/* incorrect status caused by error recovering */ \
if (scanner->ind_typ_stk.size == 1) { \
return false; \
} \
pop_ind(scanner); \
}
#define PUSH_IND(TYP, LEN) push_ind(scanner, TYP, LEN)
#define PUSH_BGN_IND(TYP) \
{ \
if (has_tab_ind) \
return false; \
push_ind(scanner, TYP, bgn_col); \
}
#define MAY_PUSH_IMP_IND(TYP) \
{ \
if (cur_ind != scanner->blk_imp_col) { \
if (scanner->blk_imp_tab) \
return false; \
push_ind(scanner, IND_MAP, scanner->blk_imp_col); \
} \
}
#define MAY_PUSH_SPC_SEQ_IND() \
{ \
if (cur_ind_typ == IND_MAP) { \
push_ind(scanner, IND_SEQ, bgn_col); \
} \
}
#define MAY_UPD_IMP_COL() \
{ \
if (scanner->blk_imp_row != bgn_row) { \
scanner->blk_imp_row = bgn_row; \
scanner->blk_imp_col = bgn_col; \
scanner->blk_imp_tab = has_tab_ind; \
} \
}
#if HAS_TIMESTAMP
#define SGL_PLN_SYM(POS, CTX) \
(scanner->rlt_sch == RS_NULL ? POS##_SGL_PLN_NUL_##CTX \
: scanner->rlt_sch == RS_BOOL ? POS##_SGL_PLN_BOL_##CTX \
: scanner->rlt_sch == RS_INT ? POS##_SGL_PLN_INT_##CTX \
: scanner->rlt_sch == RS_FLOAT ? POS##_SGL_PLN_FLT_##CTX \
: scanner->rlt_sch == RS_TIMESTAMP ? POS##_SGL_PLN_TMS_##CTX \
: POS##_SGL_PLN_STR_##CTX)
#else
#define SGL_PLN_SYM(POS, CTX) \
(scanner->rlt_sch == RS_NULL ? POS##_SGL_PLN_NUL_##CTX \
: scanner->rlt_sch == RS_BOOL ? POS##_SGL_PLN_BOL_##CTX \
: scanner->rlt_sch == RS_INT ? POS##_SGL_PLN_INT_##CTX \
: scanner->rlt_sch == RS_FLOAT ? POS##_SGL_PLN_FLT_##CTX \
: POS##_SGL_PLN_STR_##CTX)
#endif
typedef struct {
int16_t row;
int16_t col;
int16_t blk_imp_row;
int16_t blk_imp_col;
int16_t blk_imp_tab;
Array(int16_t) ind_typ_stk;
Array(int16_t) ind_len_stk;
// temp
int16_t end_row;
int16_t end_col;
int16_t cur_row;
int16_t cur_col;
int32_t cur_chr;
int8_t sch_stt;
ResultSchema rlt_sch;
} Scanner;
static unsigned serialize(Scanner *scanner, char *buffer) {
size_t size = 0;
*(int16_t *)&buffer[size] = scanner->row;
size += sizeof(int16_t);
*(int16_t *)&buffer[size] = scanner->col;
size += sizeof(int16_t);
*(int16_t *)&buffer[size] = scanner->blk_imp_row;
size += sizeof(int16_t);
*(int16_t *)&buffer[size] = scanner->blk_imp_col;
size += sizeof(int16_t);
*(int16_t *)&buffer[size] = scanner->blk_imp_tab;
size += sizeof(int16_t);
int16_t *typ_itr = scanner->ind_typ_stk.contents + 1;
int16_t *typ_end = scanner->ind_typ_stk.contents + scanner->ind_typ_stk.size;
int16_t *len_itr = scanner->ind_len_stk.contents + 1;
for (; typ_itr != typ_end && size < TREE_SITTER_SERIALIZATION_BUFFER_SIZE; ++typ_itr, ++len_itr) {
*(int16_t *)&buffer[size] = *typ_itr;
size += sizeof(int16_t);
*(int16_t *)&buffer[size] = *len_itr;
size += sizeof(int16_t);
}
return size;
}
static void deserialize(Scanner *scanner, const char *buffer, unsigned length) {
scanner->row = 0;
scanner->col = 0;
scanner->blk_imp_row = -1;
scanner->blk_imp_col = -1;
scanner->blk_imp_tab = 0;
array_delete(&scanner->ind_typ_stk);
array_push(&scanner->ind_typ_stk, IND_ROT);
array_delete(&scanner->ind_len_stk);
array_push(&scanner->ind_len_stk, -1);
if (length > 0) {
size_t size = 0;
scanner->row = *(int16_t *)&buffer[size];
size += sizeof(int16_t);
scanner->col = *(int16_t *)&buffer[size];
size += sizeof(int16_t);
scanner->blk_imp_row = *(int16_t *)&buffer[size];
size += sizeof(int16_t);
scanner->blk_imp_col = *(int16_t *)&buffer[size];
size += sizeof(int16_t);
scanner->blk_imp_tab = *(int16_t *)&buffer[size];
size += sizeof(int16_t);
while (size < length) {
array_push(&scanner->ind_typ_stk, *(int16_t *)&buffer[size]);
size += sizeof(int16_t);
array_push(&scanner->ind_len_stk, *(int16_t *)&buffer[size]);
size += sizeof(int16_t);
}
assert(size == length);
}
}
static inline void adv(Scanner *scanner, TSLexer *lexer) {
scanner->cur_col++;
scanner->cur_chr = lexer->lookahead;
lexer->advance(lexer, false);
}
static inline void adv_nwl(Scanner *scanner, TSLexer *lexer) {
scanner->cur_row++;
scanner->cur_col = 0;
scanner->cur_chr = lexer->lookahead;
lexer->advance(lexer, false);
}
static inline void skp(Scanner *scanner, TSLexer *lexer) {
scanner->cur_col++;
scanner->cur_chr = lexer->lookahead;
lexer->advance(lexer, true);
}
static inline void skp_nwl(Scanner *scanner, TSLexer *lexer) {
scanner->cur_row++;
scanner->cur_col = 0;
scanner->cur_chr = lexer->lookahead;
lexer->advance(lexer, true);
}
static inline void mrk_end(Scanner *scanner, TSLexer *lexer) {
scanner->end_row = scanner->cur_row;
scanner->end_col = scanner->cur_col;
lexer->mark_end(lexer);
}
static inline void init(Scanner *scanner) {
scanner->cur_row = scanner->row;
scanner->cur_col = scanner->col;
scanner->cur_chr = 0;
scanner->sch_stt = 0;
scanner->rlt_sch = RS_STR;
}
static inline void flush(Scanner *scanner) {
scanner->row = scanner->end_row;
scanner->col = scanner->end_col;
}
static inline void pop_ind(Scanner *scanner) {
array_pop(&scanner->ind_len_stk);
array_pop(&scanner->ind_typ_stk);
}
static inline void push_ind(Scanner *scanner, int16_t typ, int16_t len) {
array_push(&scanner->ind_len_stk, len);
array_push(&scanner->ind_typ_stk, typ);
}
static inline bool is_wsp(int32_t c) { return c == ' ' || c == '\t'; }
static inline bool is_nwl(int32_t c) { return c == '\r' || c == '\n'; }
static inline bool is_wht(int32_t c) { return is_wsp(c) || is_nwl(c) || c == 0; }
static inline bool is_ns_dec_digit(int32_t c) { return c >= '0' && c <= '9'; }
static inline bool is_ns_hex_digit(int32_t c) {
return is_ns_dec_digit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
}
static inline bool is_ns_word_char(int32_t c) {
return c == '-' || (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
static inline bool is_nb_json(int32_t c) { return c == 0x09 || (c >= 0x20 && c <= 0x10ffff); }
static inline bool is_nb_double_char(int32_t c) { return is_nb_json(c) && c != '\\' && c != '"'; }
static inline bool is_nb_single_char(int32_t c) { return is_nb_json(c) && c != '\''; }
static inline bool is_ns_char(int32_t c) {
return (c >= 0x21 && c <= 0x7e) || c == 0x85 || (c >= 0xa0 && c <= 0xd7ff) || (c >= 0xe000 && c <= 0xfefe) ||
(c >= 0xff00 && c <= 0xfffd) || (c >= 0x10000 && c <= 0x10ffff);
}
static inline bool is_c_indicator(int32_t c) {
return c == '-' || c == '?' || c == ':' || c == ',' || c == '[' || c == ']' || c == '{' || c == '}' || c == '#' ||
c == '&' || c == '*' || c == '!' || c == '|' || c == '>' || c == '\'' || c == '"' || c == '%' || c == '@' ||
c == '`';
}
static inline bool is_c_flow_indicator(int32_t c) { return c == ',' || c == '[' || c == ']' || c == '{' || c == '}'; }
static inline bool is_plain_safe_in_block(int32_t c) { return is_ns_char(c); }
static inline bool is_plain_safe_in_flow(int32_t c) { return is_ns_char(c) && !is_c_flow_indicator(c); }
static inline bool is_ns_uri_char(int32_t c) {
return is_ns_word_char(c) || c == '#' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || c == '&' ||
c == '=' || c == '+' || c == '$' || c == ',' || c == '_' || c == '.' || c == '!' || c == '~' || c == '*' ||
c == '\'' || c == '(' || c == ')' || c == '[' || c == ']';
}
static inline bool is_ns_tag_char(int32_t c) {
return is_ns_word_char(c) || c == '#' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || c == '&' ||
c == '=' || c == '+' || c == '$' || c == '_' || c == '.' || c == '~' || c == '*' || c == '\'' || c == '(' ||
c == ')';
}
static inline bool is_ns_anchor_char(int32_t c) { return is_ns_char(c) && !is_c_flow_indicator(c); }
static char scn_uri_esc(Scanner *scanner, TSLexer *lexer) {
if (lexer->lookahead != '%') {
return SCN_STOP;
}
mrk_end(scanner, lexer);
adv(scanner, lexer);
if (!is_ns_hex_digit(lexer->lookahead)) {
return SCN_FAIL;
}
adv(scanner, lexer);
if (!is_ns_hex_digit(lexer->lookahead)) {
return SCN_FAIL;
}
adv(scanner, lexer);
return SCN_SUCC;
}
static char scn_ns_uri_char(Scanner *scanner, TSLexer *lexer) {
if (is_ns_uri_char(lexer->lookahead)) {
adv(scanner, lexer);
return SCN_SUCC;
}
return scn_uri_esc(scanner, lexer);
}
static char scn_ns_tag_char(Scanner *scanner, TSLexer *lexer) {
if (is_ns_tag_char(lexer->lookahead)) {
adv(scanner, lexer);
return SCN_SUCC;
}
return scn_uri_esc(scanner, lexer);
}
static bool scn_dir_bgn(Scanner *scanner, TSLexer *lexer) {
adv(scanner, lexer);
if (lexer->lookahead == 'Y') {
adv(scanner, lexer);
if (lexer->lookahead == 'A') {
adv(scanner, lexer);
if (lexer->lookahead == 'M') {
adv(scanner, lexer);
if (lexer->lookahead == 'L') {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
mrk_end(scanner, lexer);
RET_SYM(S_DIR_YML_BGN);
}
}
}
}
} else if (lexer->lookahead == 'T') {
adv(scanner, lexer);
if (lexer->lookahead == 'A') {
adv(scanner, lexer);
if (lexer->lookahead == 'G') {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
mrk_end(scanner, lexer);
RET_SYM(S_DIR_TAG_BGN);
}
}
}
}
for (;;) {
if (!is_ns_char(lexer->lookahead)) {
break;
}
adv(scanner, lexer);
}
if (scanner->cur_col > 1 && is_wht(lexer->lookahead)) {
mrk_end(scanner, lexer);
RET_SYM(S_DIR_RSV_BGN);
}
return false;
}
static bool scn_dir_yml_ver(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
uint16_t n1 = 0;
uint16_t n2 = 0;
while (is_ns_dec_digit(lexer->lookahead)) {
adv(scanner, lexer);
n1++;
}
if (lexer->lookahead != '.') {
return false;
}
adv(scanner, lexer);
while (is_ns_dec_digit(lexer->lookahead)) {
adv(scanner, lexer);
n2++;
}
if (n1 == 0 || n2 == 0) {
return false;
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_tag_hdl_tal(Scanner *scanner, TSLexer *lexer) {
if (lexer->lookahead == '!') {
adv(scanner, lexer);
return true;
}
uint16_t n = 0;
while (is_ns_word_char(lexer->lookahead)) {
adv(scanner, lexer);
n++;
}
if (n == 0) {
return true;
}
if (lexer->lookahead == '!') {
adv(scanner, lexer);
return true;
}
return false;
}
static bool scn_dir_tag_hdl(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead == '!') {
adv(scanner, lexer);
if (scn_tag_hdl_tal(scanner, lexer)) {
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
}
return false;
}
static bool scn_dir_tag_pfx(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead == '!') {
adv(scanner, lexer);
} else if (scn_ns_tag_char(scanner, lexer) == SCN_SUCC) {
;
} else {
return false;
}
for (;;) {
switch (scn_ns_uri_char(scanner, lexer)) {
case SCN_STOP:
mrk_end(scanner, lexer);
case SCN_FAIL:
RET_SYM(result_symbol);
default:
break;
}
}
}
static bool scn_dir_rsv_prm(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (!is_ns_char(lexer->lookahead)) {
return false;
}
adv(scanner, lexer);
while (is_ns_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_tag(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead != '!') {
return false;
}
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
if (lexer->lookahead == '<') {
adv(scanner, lexer);
if (scn_ns_uri_char(scanner, lexer) != SCN_SUCC) {
return false;
}
for (;;) {
switch (scn_ns_uri_char(scanner, lexer)) {
case SCN_STOP:
if (lexer->lookahead == '>') {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
case SCN_FAIL:
return false;
default:
break;
}
}
} else {
if (scn_tag_hdl_tal(scanner, lexer) && scn_ns_tag_char(scanner, lexer) != SCN_SUCC) {
return false;
}
for (;;) {
switch (scn_ns_tag_char(scanner, lexer)) {
case SCN_STOP:
mrk_end(scanner, lexer);
case SCN_FAIL:
RET_SYM(result_symbol);
default:
break;
}
}
}
return false;
}
static bool scn_acr_bgn(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead != '&') {
return false;
}
adv(scanner, lexer);
if (!is_ns_anchor_char(lexer->lookahead)) {
return false;
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_acr_ctn(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
while (is_ns_anchor_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_als_bgn(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead != '*') {
return false;
}
adv(scanner, lexer);
if (!is_ns_anchor_char(lexer->lookahead)) {
return false;
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_als_ctn(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
while (is_ns_anchor_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_dqt_esc_seq(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
uint16_t i;
switch (lexer->lookahead) {
case '0':
case 'a':
case 'b':
case 't':
case '\t':
case 'n':
case 'v':
case 'r':
case 'e':
case 'f':
case ' ':
case '"':
case '/':
case '\\':
case 'N':
case '_':
case 'L':
case 'P':
adv(scanner, lexer);
break;
case 'U':
adv(scanner, lexer);
for (i = 0; i < 8; i++) {
if (is_ns_hex_digit(lexer->lookahead)) {
adv(scanner, lexer);
} else {
return false;
}
}
break;
case 'u':
adv(scanner, lexer);
for (i = 0; i < 4; i++) {
if (is_ns_hex_digit(lexer->lookahead)) {
adv(scanner, lexer);
} else {
return false;
}
}
break;
case 'x':
adv(scanner, lexer);
for (i = 0; i < 2; i++) {
if (is_ns_hex_digit(lexer->lookahead)) {
adv(scanner, lexer);
} else {
return false;
}
}
break;
default:
return false;
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_drs_doc_end(Scanner *scanner, TSLexer *lexer) {
if (lexer->lookahead != '-' && lexer->lookahead != '.') {
return false;
}
int32_t delimeter = lexer->lookahead;
adv(scanner, lexer);
if (lexer->lookahead == delimeter) {
adv(scanner, lexer);
if (lexer->lookahead == delimeter) {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
return true;
}
}
}
mrk_end(scanner, lexer);
return false;
}
static bool scn_dqt_str_cnt(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (!is_nb_double_char(lexer->lookahead)) {
return false;
}
if (scanner->cur_col == 0 && scn_drs_doc_end(scanner, lexer)) {
mrk_end(scanner, lexer);
RET_SYM(scanner->cur_chr == '-' ? S_DRS_END : S_DOC_END);
} else {
adv(scanner, lexer);
}
while (is_nb_double_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_sqt_str_cnt(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (!is_nb_single_char(lexer->lookahead)) {
return false;
}
if (scanner->cur_col == 0 && scn_drs_doc_end(scanner, lexer)) {
mrk_end(scanner, lexer);
RET_SYM(scanner->cur_chr == '-' ? S_DRS_END : S_DOC_END);
} else {
adv(scanner, lexer);
}
while (is_nb_single_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(result_symbol);
}
static bool scn_blk_str_bgn(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (lexer->lookahead != '|' && lexer->lookahead != '>') {
return false;
}
adv(scanner, lexer);
int16_t cur_ind = *array_back(&scanner->ind_len_stk);
int16_t ind = -1;
if (lexer->lookahead >= '1' && lexer->lookahead <= '9') {
ind = lexer->lookahead - '1';
adv(scanner, lexer);
if (lexer->lookahead == '+' || lexer->lookahead == '-') {
adv(scanner, lexer);
}
} else if (lexer->lookahead == '+' || lexer->lookahead == '-') {
adv(scanner, lexer);
if (lexer->lookahead >= '1' && lexer->lookahead <= '9') {
ind = lexer->lookahead - '1';
adv(scanner, lexer);
}
}
if (!is_wht(lexer->lookahead)) {
return false;
}
mrk_end(scanner, lexer);
if (ind != -1) {
ind += cur_ind;
} else {
ind = cur_ind;
while (is_wsp(lexer->lookahead)) {
adv(scanner, lexer);
}
if (lexer->lookahead == '#') {
adv(scanner, lexer);
while (!is_nwl(lexer->lookahead) && lexer->lookahead != 0) {
adv(scanner, lexer);
}
}
if (is_nwl(lexer->lookahead)) {
adv_nwl(scanner, lexer);
}
while (lexer->lookahead != 0) {
if (lexer->lookahead == ' ') {
adv(scanner, lexer);
} else if (is_nwl(lexer->lookahead)) {
if (scanner->cur_col - 1 < ind) {
break;
}
ind = scanner->cur_col - 1;
adv_nwl(scanner, lexer);
} else {
if (scanner->cur_col - 1 > ind) {
ind = scanner->cur_col - 1;
}
break;
}
}
}
PUSH_IND(IND_STR, ind);
RET_SYM(result_symbol);
}
static bool scn_blk_str_cnt(Scanner *scanner, TSLexer *lexer, TSSymbol result_symbol) {
if (!is_ns_char(lexer->lookahead)) {
return false;
}
if (scanner->cur_col == 0 && scn_drs_doc_end(scanner, lexer)) {
POP_IND();
RET_SYM(BL);
} else {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
for (;;) {
if (is_ns_char(lexer->lookahead)) {
adv(scanner, lexer);
while (is_ns_char(lexer->lookahead)) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
}
if (is_wsp(lexer->lookahead)) {
adv(scanner, lexer);
while (is_wsp(lexer->lookahead)) {
adv(scanner, lexer);
}
} else {
break;
}
}
RET_SYM(result_symbol);
}
static char scn_pln_cnt(Scanner *scanner, TSLexer *lexer, bool (*is_plain_safe)(int32_t)) {
bool is_cur_wsp = is_wsp(scanner->cur_chr);
bool is_cur_saf = is_plain_safe(scanner->cur_chr);
bool is_lka_wsp = is_wsp(lexer->lookahead);
bool is_lka_saf = is_plain_safe(lexer->lookahead);
if (is_lka_saf || is_lka_wsp) {
for (;;) {
if (is_lka_saf && lexer->lookahead != '#' && lexer->lookahead != ':') {
adv(scanner, lexer);
mrk_end(scanner, lexer);
scanner->sch_stt = adv_sch_stt(scanner->sch_stt, scanner->cur_chr, &scanner->rlt_sch);
} else if (is_cur_saf && lexer->lookahead == '#') {
adv(scanner, lexer);
mrk_end(scanner, lexer);
scanner->sch_stt = adv_sch_stt(scanner->sch_stt, scanner->cur_chr, &scanner->rlt_sch);
} else if (is_lka_wsp) {
adv(scanner, lexer);
scanner->sch_stt = adv_sch_stt(scanner->sch_stt, scanner->cur_chr, &scanner->rlt_sch);
} else if (lexer->lookahead == ':') {
adv(scanner, lexer); // check later
} else {
break;
}
is_cur_wsp = is_lka_wsp;
is_cur_saf = is_lka_saf;
is_lka_wsp = is_wsp(lexer->lookahead);
is_lka_saf = is_plain_safe(lexer->lookahead);
if (scanner->cur_chr == ':') {
if (is_lka_saf) {
mrk_end(scanner, lexer);
scanner->sch_stt = adv_sch_stt(scanner->sch_stt, scanner->cur_chr, &scanner->rlt_sch);
} else {
return SCN_FAIL;
}
}
}
} else {
return SCN_STOP;
}
return SCN_SUCC;
}
static bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {
init(scanner);
mrk_end(scanner, lexer);
bool allow_comment = !(valid_symbols[R_DQT_STR_CTN] || valid_symbols[BR_DQT_STR_CTN] ||
valid_symbols[R_SQT_STR_CTN] || valid_symbols[BR_SQT_STR_CTN]);
int16_t *ind_ptr = scanner->ind_len_stk.contents + scanner->ind_len_stk.size - 1;
int16_t *ind_end = scanner->ind_len_stk.contents - 1;
int16_t cur_ind = *ind_ptr--;
int16_t prt_ind = ind_ptr == ind_end ? -1 : *ind_ptr;
int16_t cur_ind_typ = *array_back(&scanner->ind_typ_stk);
bool has_tab_ind = false;
int16_t leading_spaces = 0;
for (;;) {
if (lexer->lookahead == ' ') {
if (!has_tab_ind) {
leading_spaces++;
}
skp(scanner, lexer);
} else if (lexer->lookahead == '\t') {
has_tab_ind = true;
skp(scanner, lexer);
} else if (is_nwl(lexer->lookahead)) {
has_tab_ind = false;
leading_spaces = 0;
skp_nwl(scanner, lexer);
} else if (allow_comment && lexer->lookahead == '#') {
if (valid_symbols[BR_BLK_STR_CTN] && valid_symbols[BL] && scanner->cur_col <= cur_ind) {
POP_IND();
RET_SYM(BL);
}
if (valid_symbols[BR_BLK_STR_CTN]
? scanner->cur_row == scanner->row
: scanner->cur_col == 0 || scanner->cur_row != scanner->row || scanner->cur_col > scanner->col) {
adv(scanner, lexer);
while (!is_nwl(lexer->lookahead) && lexer->lookahead != 0) {
adv(scanner, lexer);
}
mrk_end(scanner, lexer);
RET_SYM(COMMENT);
} else {
break;
}
} else {
break;
}
}
if (lexer->lookahead == 0) {
if (valid_symbols[BL]) {
mrk_end(scanner, lexer);
POP_IND();
RET_SYM(BL)
}
if (valid_symbols[END_OF_FILE]) {
mrk_end(scanner, lexer);
RET_SYM(END_OF_FILE)
}
return false;
}
int16_t bgn_row = scanner->cur_row;
int16_t bgn_col = scanner->cur_col;
int32_t bgn_chr = lexer->lookahead;
if (valid_symbols[BL] && bgn_col <= cur_ind && !has_tab_ind) {
if (cur_ind == prt_ind && cur_ind_typ == IND_SEQ ? bgn_col < cur_ind || lexer->lookahead != '-'
: bgn_col <= prt_ind || cur_ind_typ == IND_STR) {
POP_IND();
RET_SYM(BL);
}
}
bool has_nwl = scanner->cur_row > scanner->row;
bool is_r = !has_nwl;
bool is_br = has_nwl && leading_spaces > cur_ind;
bool is_b = has_nwl && leading_spaces == cur_ind && !has_tab_ind;
bool is_s = bgn_col == 0;
if (valid_symbols[R_DIR_YML_VER] && is_r) {
return scn_dir_yml_ver(scanner, lexer, R_DIR_YML_VER);
}
if (valid_symbols[R_DIR_TAG_HDL] && is_r) {
return scn_dir_tag_hdl(scanner, lexer, R_DIR_TAG_HDL);
}
if (valid_symbols[R_DIR_TAG_PFX] && is_r) {
return scn_dir_tag_pfx(scanner, lexer, R_DIR_TAG_PFX);
}
if (valid_symbols[R_DIR_RSV_PRM] && is_r) {
return scn_dir_rsv_prm(scanner, lexer, R_DIR_RSV_PRM);
}
if (valid_symbols[BR_BLK_STR_CTN] && is_br && scn_blk_str_cnt(scanner, lexer, BR_BLK_STR_CTN)) {
return true;
}
if ((valid_symbols[R_DQT_STR_CTN] && is_r && scn_dqt_str_cnt(scanner, lexer, R_DQT_STR_CTN)) ||
(valid_symbols[BR_DQT_STR_CTN] && (is_br || has_nwl) && scn_dqt_str_cnt(scanner, lexer, BR_DQT_STR_CTN))) {
return true;
}
if ((valid_symbols[R_SQT_STR_CTN] && is_r && scn_sqt_str_cnt(scanner, lexer, R_SQT_STR_CTN)) ||
(valid_symbols[BR_SQT_STR_CTN] && is_br && scn_sqt_str_cnt(scanner, lexer, BR_SQT_STR_CTN))) {
return true;
}
if (valid_symbols[R_ACR_CTN] && is_r) {
return scn_acr_ctn(scanner, lexer, R_ACR_CTN);
}
if (valid_symbols[R_ALS_CTN] && is_r) {
return scn_als_ctn(scanner, lexer, R_ALS_CTN);
}
if (lexer->lookahead == '%') {
if (valid_symbols[S_DIR_YML_BGN] && is_s) {
return scn_dir_bgn(scanner, lexer);
}
} else if (lexer->lookahead == '*') {
if (valid_symbols[R_ALS_BGN] && is_r) {
MAY_UPD_IMP_COL();
return scn_als_bgn(scanner, lexer, R_ALS_BGN);
}
if (valid_symbols[BR_ALS_BGN] && is_br) {
MAY_UPD_IMP_COL();
return scn_als_bgn(scanner, lexer, BR_ALS_BGN);
}
if (valid_symbols[B_ALS_BGN] && is_b) {
MAY_UPD_IMP_COL();
return scn_als_bgn(scanner, lexer, B_ALS_BGN);
}
} else if (lexer->lookahead == '&') {
if (valid_symbols[R_ACR_BGN] && is_r) {
MAY_UPD_IMP_COL();
return scn_acr_bgn(scanner, lexer, R_ACR_BGN);
}
if (valid_symbols[BR_ACR_BGN] && is_br) {
MAY_UPD_IMP_COL();
return scn_acr_bgn(scanner, lexer, BR_ACR_BGN);
}
if (valid_symbols[B_ACR_BGN] && is_b) {
MAY_UPD_IMP_COL();
return scn_acr_bgn(scanner, lexer, B_ACR_BGN);
}
} else if (lexer->lookahead == '!') {
if (valid_symbols[R_TAG] && is_r) {
MAY_UPD_IMP_COL();
return scn_tag(scanner, lexer, R_TAG);
}
if (valid_symbols[BR_TAG] && is_br) {
MAY_UPD_IMP_COL();
return scn_tag(scanner, lexer, BR_TAG);
}
if (valid_symbols[B_TAG] && is_b) {
MAY_UPD_IMP_COL();
return scn_tag(scanner, lexer, B_TAG);
}
} else if (lexer->lookahead == '[') {
if (valid_symbols[R_FLW_SEQ_BGN] && is_r) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_SEQ_BGN)
}
if (valid_symbols[BR_FLW_SEQ_BGN] && is_br) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_SEQ_BGN)
}
if (valid_symbols[B_FLW_SEQ_BGN] && is_b) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(B_FLW_SEQ_BGN)
}
} else if (lexer->lookahead == ']') {
if (valid_symbols[R_FLW_SEQ_END] && is_r) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_SEQ_END)
}
if (valid_symbols[BR_FLW_SEQ_END] && is_br) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_SEQ_END)
}
if (valid_symbols[B_FLW_SEQ_END] && is_b) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_SEQ_END)
}
} else if (lexer->lookahead == '{') {
if (valid_symbols[R_FLW_MAP_BGN] && is_r) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_MAP_BGN)
}
if (valid_symbols[BR_FLW_MAP_BGN] && is_br) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_MAP_BGN)
}
if (valid_symbols[B_FLW_MAP_BGN] && is_b) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(B_FLW_MAP_BGN)
}
} else if (lexer->lookahead == '}') {
if (valid_symbols[R_FLW_MAP_END] && is_r) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_MAP_END)
}
if (valid_symbols[BR_FLW_MAP_END] && is_br) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_MAP_END)
}
if (valid_symbols[B_FLW_MAP_END] && is_b) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_MAP_END)
}
} else if (lexer->lookahead == ',') {
if (valid_symbols[R_FLW_SEP_BGN] && is_r) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_SEP_BGN)
}
if (valid_symbols[BR_FLW_SEP_BGN] && is_br) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_SEP_BGN)
}
} else if (lexer->lookahead == '"') {
if (valid_symbols[R_DQT_STR_BGN] && is_r) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_DQT_STR_BGN)
}
if (valid_symbols[BR_DQT_STR_BGN] && is_br) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_DQT_STR_BGN)
}
if (valid_symbols[B_DQT_STR_BGN] && is_b) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(B_DQT_STR_BGN)
}
if (valid_symbols[R_DQT_STR_END] && is_r) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_DQT_STR_END)
}
if (valid_symbols[BR_DQT_STR_END] && is_br) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_DQT_STR_END)
}
} else if (lexer->lookahead == '\'') {
if (valid_symbols[R_SQT_STR_BGN] && is_r) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_SQT_STR_BGN)
}
if (valid_symbols[BR_SQT_STR_BGN] && is_br) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_SQT_STR_BGN)
}
if (valid_symbols[B_SQT_STR_BGN] && is_b) {
MAY_UPD_IMP_COL();
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(B_SQT_STR_BGN)
}
if (valid_symbols[R_SQT_STR_END] && is_r) {
adv(scanner, lexer);
if (lexer->lookahead == '\'') {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_SQT_ESC_SQT)
} else {
mrk_end(scanner, lexer);
RET_SYM(R_SQT_STR_END)
}
}
if (valid_symbols[BR_SQT_STR_END] && is_br) {
adv(scanner, lexer);
if (lexer->lookahead == '\'') {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_SQT_ESC_SQT)
} else {
mrk_end(scanner, lexer);
RET_SYM(BR_SQT_STR_END)
}
}
} else if (lexer->lookahead == '?') {
bool is_r_blk_key_bgn = valid_symbols[R_BLK_KEY_BGN] && is_r;
bool is_br_blk_key_bgn = valid_symbols[BR_BLK_KEY_BGN] && is_br;
bool is_b_blk_key_bgn = valid_symbols[B_BLK_KEY_BGN] && is_b;
bool is_r_flw_key_bgn = valid_symbols[R_FLW_KEY_BGN] && is_r;
bool is_br_flw_key_bgn = valid_symbols[BR_FLW_KEY_BGN] && is_br;
if (is_r_blk_key_bgn || is_br_blk_key_bgn || is_b_blk_key_bgn || is_r_flw_key_bgn || is_br_flw_key_bgn) {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
mrk_end(scanner, lexer);
if (is_r_blk_key_bgn) {
PUSH_BGN_IND(IND_MAP);
RET_SYM(R_BLK_KEY_BGN);
}
if (is_br_blk_key_bgn) {
PUSH_BGN_IND(IND_MAP);
RET_SYM(BR_BLK_KEY_BGN);
}
if (is_b_blk_key_bgn)
RET_SYM(B_BLK_KEY_BGN);
if (is_r_flw_key_bgn)
RET_SYM(R_FLW_KEY_BGN);
if (is_br_flw_key_bgn)
RET_SYM(BR_FLW_KEY_BGN);
}
}
} else if (lexer->lookahead == ':') {
if (valid_symbols[R_FLW_JSV_BGN] && is_r) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(R_FLW_JSV_BGN);
}
if (valid_symbols[BR_FLW_JSV_BGN] && is_br) {
adv(scanner, lexer);
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_JSV_BGN);
}
bool is_r_blk_val_bgn = valid_symbols[R_BLK_VAL_BGN] && is_r;
bool is_br_blk_val_bgn = valid_symbols[BR_BLK_VAL_BGN] && is_br;
bool is_b_blk_val_bgn = valid_symbols[B_BLK_VAL_BGN] && is_b;
bool is_r_blk_imp_bgn = valid_symbols[R_BLK_IMP_BGN] && is_r;
bool is_r_flw_njv_bgn = valid_symbols[R_FLW_NJV_BGN] && is_r;
bool is_br_flw_njv_bgn = valid_symbols[BR_FLW_NJV_BGN] && is_br;
if (is_r_blk_val_bgn || is_br_blk_val_bgn || is_b_blk_val_bgn || is_r_blk_imp_bgn || is_r_flw_njv_bgn ||
is_br_flw_njv_bgn) {
adv(scanner, lexer);
bool is_lka_wht = is_wht(lexer->lookahead);
if (is_lka_wht) {
if (is_r_blk_val_bgn) {
PUSH_BGN_IND(IND_MAP);
mrk_end(scanner, lexer);
RET_SYM(R_BLK_VAL_BGN);
}
if (is_br_blk_val_bgn) {
PUSH_BGN_IND(IND_MAP);
mrk_end(scanner, lexer);
RET_SYM(BR_BLK_VAL_BGN);
}
if (is_b_blk_val_bgn) {
mrk_end(scanner, lexer);
RET_SYM(B_BLK_VAL_BGN);
}
if (is_r_blk_imp_bgn) {
MAY_PUSH_IMP_IND();
mrk_end(scanner, lexer);
RET_SYM(R_BLK_IMP_BGN);
}
}
if (is_lka_wht || lexer->lookahead == ',' || lexer->lookahead == ']' || lexer->lookahead == '}') {
if (is_r_flw_njv_bgn) {
mrk_end(scanner, lexer);
RET_SYM(R_FLW_NJV_BGN);
}
if (is_br_flw_njv_bgn) {
mrk_end(scanner, lexer);
RET_SYM(BR_FLW_NJV_BGN);
}
}
}
} else if (lexer->lookahead == '-') {
bool is_r_blk_seq_bgn = valid_symbols[R_BLK_SEQ_BGN] && is_r;
bool is_br_blk_seq_bgn = valid_symbols[BR_BLK_SEQ_BGN] && is_br;
bool is_b_blk_seq_bgn = valid_symbols[B_BLK_SEQ_BGN] && is_b;
bool is_s_drs_end = is_s;
if (is_r_blk_seq_bgn || is_br_blk_seq_bgn || is_b_blk_seq_bgn || is_s_drs_end) {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
if (is_r_blk_seq_bgn) {
PUSH_BGN_IND(IND_SEQ);
mrk_end(scanner, lexer);
RET_SYM(R_BLK_SEQ_BGN)
}
if (is_br_blk_seq_bgn) {
PUSH_BGN_IND(IND_SEQ);
mrk_end(scanner, lexer);
RET_SYM(BR_BLK_SEQ_BGN)
}
if (is_b_blk_seq_bgn) {
MAY_PUSH_SPC_SEQ_IND();
mrk_end(scanner, lexer);
RET_SYM(B_BLK_SEQ_BGN)
}
} else if (lexer->lookahead == '-' && is_s_drs_end) {
adv(scanner, lexer);
if (lexer->lookahead == '-') {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
if (valid_symbols[BL]) {
POP_IND();
RET_SYM(BL);
}
mrk_end(scanner, lexer);
RET_SYM(S_DRS_END);
}
}
}
}
} else if (lexer->lookahead == '.') {
if (is_s) {
adv(scanner, lexer);
if (lexer->lookahead == '.') {
adv(scanner, lexer);
if (lexer->lookahead == '.') {
adv(scanner, lexer);
if (is_wht(lexer->lookahead)) {
if (valid_symbols[BL]) {
POP_IND();
RET_SYM(BL);
}
mrk_end(scanner, lexer);
RET_SYM(S_DOC_END);
}
}
}
}
} else if (lexer->lookahead == '\\') {
bool is_r_dqt_esc_nwl = valid_symbols[R_DQT_ESC_NWL] && is_r;
bool is_br_dqt_esc_nwl = valid_symbols[BR_DQT_ESC_NWL] && is_br;
bool is_r_dqt_esc_seq = valid_symbols[R_DQT_ESC_SEQ] && is_r;
bool is_br_dqt_esc_seq = valid_symbols[BR_DQT_ESC_SEQ] && is_br;
if (is_r_dqt_esc_nwl || is_br_dqt_esc_nwl || is_r_dqt_esc_seq || is_br_dqt_esc_seq) {
adv(scanner, lexer);
if (is_nwl(lexer->lookahead)) {
if (is_r_dqt_esc_nwl) {
mrk_end(scanner, lexer);
RET_SYM(R_DQT_ESC_NWL)
}
if (is_br_dqt_esc_nwl) {
mrk_end(scanner, lexer);
RET_SYM(BR_DQT_ESC_NWL)
}
}
if (is_r_dqt_esc_seq) {
return scn_dqt_esc_seq(scanner, lexer, R_DQT_ESC_SEQ);
}
if (is_br_dqt_esc_seq) {
return scn_dqt_esc_seq(scanner, lexer, BR_DQT_ESC_SEQ);
}
return false;
}
} else if (lexer->lookahead == '|') {
if (valid_symbols[R_BLK_LIT_BGN] && is_r) {
return scn_blk_str_bgn(scanner, lexer, R_BLK_LIT_BGN);
}
if (valid_symbols[BR_BLK_LIT_BGN] && is_br) {
return scn_blk_str_bgn(scanner, lexer, BR_BLK_LIT_BGN);
}
} else if (lexer->lookahead == '>') {
if (valid_symbols[R_BLK_FLD_BGN] && is_r) {
return scn_blk_str_bgn(scanner, lexer, R_BLK_FLD_BGN);
}
if (valid_symbols[BR_BLK_FLD_BGN] && is_br) {
return scn_blk_str_bgn(scanner, lexer, BR_BLK_FLD_BGN);
}
}
bool maybe_sgl_pln_blk = (valid_symbols[R_SGL_PLN_STR_BLK] && is_r) ||
(valid_symbols[BR_SGL_PLN_STR_BLK] && is_br) || (valid_symbols[B_SGL_PLN_STR_BLK] && is_b);
bool maybe_sgl_pln_flw = (valid_symbols[R_SGL_PLN_STR_FLW] && is_r) || (valid_symbols[BR_SGL_PLN_STR_FLW] && is_br);
bool maybe_mtl_pln_blk = (valid_symbols[R_MTL_PLN_STR_BLK] && is_r) || (valid_symbols[BR_MTL_PLN_STR_BLK] && is_br);
bool maybe_mtl_pln_flw = (valid_symbols[R_MTL_PLN_STR_FLW] && is_r) || (valid_symbols[BR_MTL_PLN_STR_FLW] && is_br);
if (maybe_sgl_pln_blk || maybe_sgl_pln_flw || maybe_mtl_pln_blk || maybe_mtl_pln_flw) {
bool is_in_blk = maybe_sgl_pln_blk || maybe_mtl_pln_blk;
bool (*is_plain_safe)(int32_t) = is_in_blk ? is_plain_safe_in_block : is_plain_safe_in_flow;
if (scanner->cur_col - bgn_col == 0) {
adv(scanner, lexer);
}
if (scanner->cur_col - bgn_col == 1) {
bool is_plain_first =
(is_ns_char(bgn_chr) && !is_c_indicator(bgn_chr)) ||
((bgn_chr == '-' || bgn_chr == '?' || bgn_chr == ':') && is_plain_safe(lexer->lookahead));
if (!is_plain_first) {
return false;
}
scanner->sch_stt = adv_sch_stt(scanner->sch_stt, scanner->cur_chr, &scanner->rlt_sch);
} else {
// no need to check the following cases:
// ..X
// ...X
// --X
// ---X
// X: lookahead
scanner->sch_stt = SCH_STT_FRZ; // must be RS_STR
}
mrk_end(scanner, lexer);
for (;;) {
if (!is_nwl(lexer->lookahead)) {
if (scn_pln_cnt(scanner, lexer, is_plain_safe) != SCN_SUCC) {
break;
}
}
if (lexer->lookahead == 0 || !is_nwl(lexer->lookahead)) {
break;
}
for (;;) {
if (is_nwl(lexer->lookahead)) {
adv_nwl(scanner, lexer);
} else if (is_wsp(lexer->lookahead)) {
adv(scanner, lexer);
} else {
break;
}
}
if (lexer->lookahead == 0 || scanner->cur_col <= cur_ind) {
break;
}
if (scanner->cur_col == 0 && scn_drs_doc_end(scanner, lexer)) {
break;
}
}
if (scanner->end_row == bgn_row) {
if (maybe_sgl_pln_blk) {
MAY_UPD_IMP_COL();
RET_SYM(is_r ? SGL_PLN_SYM(R, BLK) : is_br ? SGL_PLN_SYM(BR, BLK) : SGL_PLN_SYM(B, BLK));
}
if (maybe_sgl_pln_flw)
RET_SYM(is_r ? SGL_PLN_SYM(R, FLW) : SGL_PLN_SYM(BR, FLW));
} else {
if (maybe_mtl_pln_blk) {
MAY_UPD_IMP_COL();
RET_SYM(is_r ? R_MTL_PLN_STR_BLK : BR_MTL_PLN_STR_BLK);
}
if (maybe_mtl_pln_flw)
RET_SYM(is_r ? R_MTL_PLN_STR_FLW : BR_MTL_PLN_STR_FLW);
}
return false;
}
return !valid_symbols[ERR_REC];
}
void *tree_sitter_yaml_external_scanner_create() {
Scanner *scanner = ts_calloc(1, sizeof(Scanner));
deserialize(scanner, NULL, 0);
return scanner;
}
void tree_sitter_yaml_external_scanner_destroy(void *payload) {
Scanner *scanner = (Scanner *)payload;
array_delete(&scanner->ind_len_stk);
array_delete(&scanner->ind_typ_stk);
ts_free(scanner);
}
unsigned tree_sitter_yaml_external_scanner_serialize(void *payload, char *buffer) {
Scanner *scanner = (Scanner *)payload;
return serialize(scanner, buffer);
}
void tree_sitter_yaml_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {
Scanner *scanner = (Scanner *)payload;
deserialize(scanner, buffer, length);
}
bool tree_sitter_yaml_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
Scanner *scanner = (Scanner *)payload;
return scan(scanner, lexer, valid_symbols);
}