WIP top-level parsing and keyword tokens
This commit is contained in:
65
parser.c
65
parser.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user