/* Copyright (c) 2024 Freya Murphy */ #ifndef __LEX_H__ #define __LEX_H__ #include #include #include struct lexer { FILE *file; int peek; int x; int y; }; struct lexer_state { long offset; int peek; int x; int y; }; enum token_type { TOK_IDENT, TOK_REG, TOK_LABEL, TOK_STRING, TOK_COMMA, TOK_EQUAL, TOK_LPAREN, TOK_RPAREN, TOK_NUMBER, TOK_EOF, TOK_NL, TOK_DIRECTIVE, }; struct token { enum token_type type; union { int64_t number; char text[MAX_LEX_LENGTH]; }; int x; int y; }; /* initalize a lexer */ int lexer_init(const char *file, struct lexer *lexer); /* free the lxer */ int lexer_free(struct lexer *lexer); /* lexes the next token, returns M_ERROR on error, * and TOK_EOF on EOF */ int lexer_next(struct lexer *lexer, struct token *token); /* token type to string */ char *token_str(enum token_type); /* save the state of a lexer */ void lexer_save(struct lexer *lexer, struct lexer_state *state); /* load a different state into a lexer */ void lexer_load(struct lexer *lexer, const struct lexer_state *state); #endif /* __LEX_H__ */