aboutsummaryrefslogtreecommitdiff
path: root/include/parser.h
blob: b9a09b2bf62b6a6da7c05afc91dfefbcea6abe31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef AMALGAM_PARSER_H
#define AMALGAM_PARSER_H

#include "std/buffer_view.h"
#include "std/arena_allocator.h"
#include "std/thread.h"
#include "tokenizer.h"
#include "ast.h"
#include "defs.h"

#include <setjmp.h>

#define PARSER_OK 0
/* General error */
#define PARSER_ERR -1
#define PARSER_UNEXPECTED_TOKEN -2

typedef enum {
    ERROR_CONTEXT_NONE,
    ERROR_CONTEXT_RHS_STANDALONE,
    ERROR_CONTEXT_NO_LHS
} ErrorContext;

struct Parser {
    Tokenizer tokenizer;
    StructDecl struct_decl;
    LhsExpr file_decl;
    Scope *current_scope;
    bool has_func_parent;
    ArenaAllocator *allocator; /* Owned */
    amal_compiler *compiler;
    Ir *ir;
    bool started;
    TokenizerError error;
    ErrorContext error_context;
    jmp_buf parse_env;
    Bytecode *bytecode;
    Buffer/*<ParserFileScopeReference*>*/ imports;
    HashMapType(BufferView, usize) imports_by_name; /* The value is an index inside @imports */
    /*
        Index in the compilers list of parsers. Used by bytecodes import header
        to point to the index that contains references to another files variables.
    */
    u32 index; 
};

CHECK_RESULT int parser_init(Parser *self, amal_compiler *compiler, ArenaAllocator *allocator);

/*
@buffer_name will be the path to the file when using parser_parse_file and when parsing a buffer
you can name the buffer anything  you want to identify it.
Should only be called once for a parser object.
*/
CHECK_RESULT int parser_parse_buffer(Parser *self, BufferView code_buffer, BufferView buffer_name);
/*
Parses a file and the dependencies that are included using @import.
Should only be called once for a parser object.
*/
CHECK_RESULT int parser_parse_file(Parser *self, BufferView filepath);

#endif