mighty

The mighty programming language, compiler and tools (WIP)
Log | Files | Refs

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);
}