stage1 新的ast结构 使用pest描述语法
This commit is contained in:
1 parent
34df303b56
commit
98b35a98e3
12 files changed
+3344
-2168
No files matched your search
+62
-101
@@ -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 */
|
||||
|
||||
Reference in new issue
Block a user