#ifndef PARSE_H #define PARSE_H #include "collection.h" #include "preproc.h" #include "resolve.h" #include "sema.h" typedef struct { char ch; bool is_term; unsigned short val; } KwNodeOpt; typedef struct { ARRAY_FIELD(KwNodeOpt, opts); size_t idx; } KwNode; typedef struct { TokStream* tokstream; Arena arena; ARRAY_FIELD(KwNode, nodes); } KwMatcher; void kwmatcher_init(KwMatcher* m, TokStream* tokstream); void kwmatcher_deinit(KwMatcher* m); Tok kwmatcher_next(KwMatcher* m); typedef enum : unsigned int { ParserFlags_ParsingTypedef = 1 << 0, } ParserFlags; typedef struct Parser { KwMatcher kwmatcher; Sema* sema; Arena* arena; Arena sym_arena; OldSyms* old_syms; Tok curr; ParserFlags flags; } Parser; void parser_init(Parser* p, TokStream* tokstream, Sema* sema, Arena* arena); void parser_deinit(Parser* p); AstStmt* parser_parse_stmt(Parser* p); bool parser_done(Parser* p); #endif