WIP top-level parsing and keyword tokens

This commit is contained in:
Krzosa Karol
2026-05-23 15:39:04 +02:00
parent fc04ee5c3e
commit b1b79abfd4
7 changed files with 431 additions and 155 deletions

View File

@@ -3,30 +3,6 @@ typedef struct Parser {
Token *end;
} Parser;
typedef enum Ast_Kind {
AST_NONE,
AST_ERROR,
AST_INT,
AST_UNARY,
AST_BINARY,
} Ast_Kind;
typedef struct Ast Ast;
struct Ast {
Ast_Kind kind;
Token *pos;
union {
uint64_t u;
struct {
Token_Kind op;
Ast *l;
Ast *r;
};
char *error;
};
};
Token *next_token(Parser *p) {
if (p->at < p->end) {
return p->at++;
@@ -41,6 +17,18 @@ Token *match_token(Parser *p, Token_Kind kind) {
return NULL;
}
bool is_keyword(Token *token) {
bool result = (token->kind >= TOK_FIRST_KEYWORD && token->kind <= TOK_LAST_KEYWORD);
return result;
}
Token *match_keyword(Parser *p, char *keyword) {
if (is_keyword(p->at) && p->at->intern == keyword) {
return next_token(p);
}
return NULL;
}
Token *expect_token(Parser *p, Token_Kind kind) {
if (p->at->kind == kind) {
return next_token(p);
@@ -48,21 +36,6 @@ Token *expect_token(Parser *p, Token_Kind kind) {
panicf("expected token kind: %s, got instead: %s", token_to_name(p->at->kind), token_to_name(kind));
}
Ast *create_ast(Token *token, Ast_Kind kind) {
Ast *result = calloc(1, sizeof(Ast));
result->pos = token;
result->kind = kind;
return result;
}
Ast *create_binary_expr(Token *token, Token_Kind op, Ast *left, Ast *right) {
Ast *result = create_ast(token, AST_BINARY);
result->op = op;
result->l = left;
result->r = right;
return result;
}
Ast *parse_expr(Parser *p, int power_of_binding_to_right);
Ast *parse_atom(Parser *p) {
@@ -118,6 +91,20 @@ Ast *parse_expr(Parser *p, int power_of_binding_to_right) {
return n;
}
Ast *parse_program(Parser *p) {
for (;;) {
if (match_keyword(p, keyword_int)) {
Token *ident = expect_token(p, TOK_IDENT);
expect_token(p, TOK_LPAREN);
expect_token(p, TOK_RPAREN);
} else {
Token *token = next_token(p);
panicf("invalid token");
}
}
return result;
}
int64_t eval_expr(Ast *n) {
switch (n->kind) {
case AST_INT: return (int64_t)n->u;