larpcc/parse.h
2026-10-03 02:14:26 +02:00

118 lines
2.1 KiB
C

#ifndef PARSE_H
#define PARSE_H
#include "ast.h"
#include "collection.h"
#include "sema.h"
#include <stddef.h>
char* read_textfile(const char* filename);
// phases:
// https://en.cppreference.com/c/language/translation_phases
// phase 1 - source chars
typedef struct {
char ch;
Loc loc;
} 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 = '#',
Tok_KwInt = 256,
Tok_KwChar,
Tok_KwConst,
Tok_KwVoid,
// used internally in preprocessor
Tok_EndOfMacroInvocation,
} TokTy;
const char* tokty_str(TokTy ty);
typedef struct {
TokTy ty;
char* text;
Loc loc;
} 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;
Preproc* preproc_new(char* filename, char* text, Arena* arena);
void preproc_free(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);
typedef struct Parser Parser;
Parser* parser_new(TokStream* tokstream, Sema* sema, Arena* arena);
void parser_free(Parser* p);
AstStmt* parser_parse_stmt(Parser* p);
bool parser_done(Parser* p);
#endif