stage1 新的ast结构 使用pest描述语法

This commit is contained in:
zzy committed 2026-09-08 13:14:29 +08:00
1 parent 34df303b56
commit 98b35a98e3
12 files changed
+3344 -2168

No files matched your search

+62 -101
View File
@@ -349,6 +349,22 @@ spl_tok_vec_t spl_lex(const char *source, const char *fname) {
}
/* Multi-character operators (longest match) */
#define TRY_OP1(c1, tok1) \
if (c == (c1)) { \
spl_tok_t tok; \
memset(&tok, 0, sizeof(tok)); \
tok.type = (tok1); \
tok.lexeme = start; \
tok.len = 1; \
tok.fname = fname; \
tok.offset = offset; \
tok.line = line; \
tok.col = col; \
vec_push(toks, tok); \
offset++; \
col++; \
continue; \
}
/* Helper: try to match a two-char operator */
#define TRY_OP2(c1, c2, tok2, tok1) \
@@ -394,13 +410,15 @@ spl_tok_vec_t spl_lex(const char *source, const char *fname) {
}
/* Three-char operators first */
TRY_OP3('<', '-', '>', TOK_ARROW_BOTH, TOK_RIGHT_ARROW, TOK_LT)
TRY_OP3('<', '=', '>', TOK_FAT_ARROW_BOTH, TOK_RIGHT_FAT_ARROW, TOK_LT)
TRY_OP3('<', '<', '=', TOK_ASSIGN_L_SH, TOK_L_SH, TOK_LT)
TRY_OP3('>', '>', '=', TOK_ASSIGN_R_SH, TOK_R_SH, TOK_GT)
TRY_OP3('.', '.', '.', TOK_ELLIPSIS, TOK_RANGE, TOK_DOT)
/* Two-char operators */
TRY_OP2('=', '=', TOK_EQ, TOK_ASSIGN)
TRY_OP2('=', '>', TOK_FAT_ARROW, TOK_ASSIGN)
TRY_OP2('=', '>', TOK_RIGHT_FAT_ARROW, TOK_ASSIGN)
TRY_OP2('!', '=', TOK_NEQ, TOK_NOT)
TRY_OP2('<', '=', TOK_LE, TOK_LT)
TRY_OP2('>', '=', TOK_GE, TOK_GT)
@@ -414,110 +432,53 @@ spl_tok_vec_t spl_lex(const char *source, const char *fname) {
TRY_OP2('&', '=', TOK_ASSIGN_AND, TOK_AND)
TRY_OP2('|', '=', TOK_ASSIGN_OR, TOK_OR)
TRY_OP2('^', '=', TOK_ASSIGN_XOR, TOK_XOR)
TRY_OP2('<', '-', TOK_LEFT_ARRAY, TOK_LT)
TRY_OP2('-', '>', TOK_RIGHT_ARRAY, TOK_SUB)
TRY_OP2('<', '-', TOK_LEFT_ARROW, TOK_LT)
TRY_OP2('-', '>', TOK_RIGHT_ARROW, TOK_SUB)
TRY_OP2(':', '=', TOK_COLON_ASSIGN, TOK_COLON)
/* Single-character operators */
{
spl_tok_type_t tt = TOK_UNKNOWN;
switch (c) {
case '+':
tt = TOK_ADD;
break;
case '-':
tt = TOK_SUB;
break;
case '*':
tt = TOK_MUL;
break;
case '/':
tt = TOK_DIV;
break;
case '%':
tt = TOK_MOD;
break;
case '&':
tt = TOK_AND;
break;
case '|':
tt = TOK_OR;
break;
case '^':
tt = TOK_XOR;
break;
case '~':
tt = TOK_BIT_NOT;
break;
case '!':
tt = TOK_NOT;
break;
case '<':
tt = TOK_LT;
break;
case '>':
tt = TOK_GT;
break;
case '=':
tt = TOK_ASSIGN;
break;
case '.':
tt = TOK_DOT;
break;
case ',':
tt = TOK_COMMA;
break;
case ';':
tt = TOK_SEMICOLON;
break;
case ':':
tt = TOK_COLON;
break;
case '(':
tt = TOK_L_PAREN;
break;
case ')':
tt = TOK_R_PAREN;
break;
case '[':
tt = TOK_L_BRACKET;
break;
case ']':
tt = TOK_R_BRACKET;
break;
case '{':
tt = TOK_L_BRACE;
break;
case '}':
tt = TOK_R_BRACE;
break;
case '#':
tt = TOK_SHARP;
break;
case '@':
tt = TOK_AT;
break;
case '?':
tt = TOK_COND;
break;
default:
tt = TOK_UNKNOWN;
break;
}
TRY_OP1('+', TOK_ADD);
TRY_OP1('-', TOK_SUB);
TRY_OP1('*', TOK_MUL);
TRY_OP1('/', TOK_DIV);
TRY_OP1('%', TOK_MOD);
TRY_OP1('&', TOK_AND);
TRY_OP1('|', TOK_OR);
TRY_OP1('^', TOK_XOR);
TRY_OP1('~', TOK_BIT_NOT);
TRY_OP1('!', TOK_NOT);
TRY_OP1('<', TOK_LT);
TRY_OP1('>', TOK_GT);
TRY_OP1('=', TOK_ASSIGN);
TRY_OP1('.', TOK_DOT);
TRY_OP1(',', TOK_COMMA);
TRY_OP1(';', TOK_SEMICOLON);
TRY_OP1(':', TOK_COLON);
TRY_OP1('(', TOK_L_PAREN);
TRY_OP1(')', TOK_R_PAREN);
TRY_OP1('[', TOK_L_BRACKET);
TRY_OP1(']', TOK_R_BRACKET);
TRY_OP1('{', TOK_L_BRACE);
TRY_OP1('}', TOK_R_BRACE);
TRY_OP1('#', TOK_SHARP);
TRY_OP1('@', TOK_AT);
TRY_OP1('$', TOK_DOLLAR);
TRY_OP1('?', TOK_COND);
spl_tok_t tok;
memset(&tok, 0, sizeof(tok));
tok.type = tt;
tok.lexeme = start;
tok.len = 1;
tok.fname = fname;
tok.offset = offset;
tok.line = line;
tok.col = col;
vec_push(toks, tok);
offset++;
col++;
}
// TODO
spl_tok_t tok;
memset(&tok, 0, sizeof(tok));
tok.type = TOK_UNKNOWN;
tok.lexeme = start;
tok.len = 1;
tok.fname = fname;
tok.offset = offset;
tok.line = line;
tok.col = col;
vec_push(toks, tok);
offset++;
col++;
continue;
}
/* EOF token */