118 lines
2.1 KiB
C
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
|