#ifndef PARSE_H #define PARSE_H #include "collection.h" #include char* read_textfile(const char* filename); // phases: // https://en.cppreference.com/c/language/translation_phases // phase 1 - source chars typedef struct { char ch; int line; int col; } Char; typedef struct { const char* text; size_t i; int line; int col; } SourceIter; void source_iter_init(SourceIter* r, const char* text); Char source_iter_next(SourceIter* r); // phase 2 - logical source lines typedef struct { SourceIter* source_char_iter; Char curr; } LslIter; void lsl_iter_init(LslIter* r, SourceIter* source_iter); Char lsl_iter_next(LslIter* r); // phase 3 - preprocessor tokens typedef enum { Tok_Eof, Tok_Ident, Tok_Int, Tok_Str, Tok_Char, Tok_Whitespace, Tok_HeaderName, Tok_Eol = '\n', // NOTE: has value 10 Tok_Semicolon = ';', Tok_LParen = '(', Tok_RParen = ')', Tok_LBrace = '{', Tok_RBrace = '}', Tok_Comma = ',', Tok_Asterisk = '*', Tok_Hashtag = '#', // used internally in preprocessor Tok_EndOfMacroInvocation, } TokTy; const char* tokty_str(TokTy ty); typedef struct { TokTy ty; char* text; int line; int col; } Tok; typedef struct { LslIter* lsl_iter; Arena* arena; Char curr; bool lex_whitespace; bool lex_headername; } Lexer; void lexer_init(Lexer* r, LslIter* lsl_iter, Arena* arena); Tok lexer_next(Lexer* l); // phase 4 - preprocessor typedef struct Preproc Preproc; void preproc_init(Preproc** p, char* filename, char* text, Arena* arena); void preproc_deinit(Preproc* p); Tok preproc_next(Preproc* p); // phase 5, 6 - preprocessor cleanup, concat strings typedef struct { Preproc* preproc; Arena* arena; Tok curr; } TokStream; void tokstream_init(TokStream* s, Preproc* preproc, Arena* arena); Tok tokstream_next(TokStream* s); #endif