#ifndef AMALGAM_PARSER_H #define AMALGAM_PARSER_H #include "std/buffer_view.h" #include "std/scoped_allocator.h" #include "std/thread.h" #include "tokenizer.h" #include "ast.h" #include "defs.h" #include #define PARSER_OK 0 /* General error */ #define PARSER_ERR -1 #define PARSER_UNEXPECTED_TOKEN -2 typedef enum { PARSER_THREAD_STATUS_NEW, PARSER_THREAD_STATUS_IDLE, PARSER_THREAD_STATUS_RUNNING } ParserThreadStatus; struct ParserThreadData { amal_thread thread; ParserThreadStatus status; ScopedAllocator allocator; }; typedef enum { ERROR_CONTEXT_NONE, ERROR_CONTEXT_RHS_START } ErrorContext; struct Parser { Tokenizer tokenizer; Scope scope; ScopedAllocator *allocator; /* borrowed. Copied from @compiler for faster access to allocator */ amal_compiler *compiler; bool started; TokenizerError error; ErrorContext error_context; jmp_buf parse_env; }; CHECK_RESULT int parser_thread_data_init(ParserThreadData *self); CHECK_RESULT int parser_thread_data_deinit(ParserThreadData *self); CHECK_RESULT int parser_thread_data_start(ParserThreadData *self, AmalThreadCallbackFunc callback_func, void *userdata); CHECK_RESULT int parser_thread_data_join(ParserThreadData *self, void **result); CHECK_RESULT int parser_init(Parser *self, amal_compiler *compiler, ScopedAllocator *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