parser.c (1566B)
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
#include "errors.h"
void add_error(struct parser *p, const char *message);
struct token peek(struct parser *p);
struct token consume(struct parser *p);
bool check(struct parser *p, enum token_type type);
void
parser_parse(struct parser *p) {
// from [x y z] [node
// decl / etc.
// nodes
while (p->pos < p->lexer->tok_len) {
struct token tok = consume(p);
switch (tok.token_type) {
case TOKEN_IDENT:
struct token type = tok;
if (!check(p, TOKEN_IDENT))
panic("expected open paren ( after label in function declaration");
break;
default:
panic("error parsing top level");
}
}
}
struct token
peek(struct parser *p) {
if (p->pos >= p->lexer->tok_len)
panic("token peek out of bounds?");
return p->lexer->tokens[p->pos + 1];
}
struct token
consume(struct parser *p) {
struct token tok = p->lexer->tokens[p->pos++];
if (tok.token_type == 0) panic("consume bad token EOF?");
return tok;
}
bool
check(struct parser *p, enum token_type type) {
return (peek(p).token_type == type);
}
void
add_error(struct parser *p, const char *message) {
const char *filename = p->lexer->tokens[p->pos].span.filename;
size_t line = p->lexer->tokens[p->pos].span.line;
size_t col = p->lexer->tokens[p->pos].span.col;
fprintf(stderr, "%s: L%zu:%zu : %s", filename, line, col, message);
}