99 lines
1.6 KiB
C
99 lines
1.6 KiB
C
#ifndef LEXER_H
|
|
#define LEXER_H
|
|
|
|
#include "utils.h"
|
|
|
|
typedef enum {
|
|
TOKEN_ERROR,
|
|
TOKEN_END,
|
|
|
|
TOKEN_PLUS, // +
|
|
TOKEN_PLUS_PLUS, // ++
|
|
TOKEN_MINUS, // -
|
|
TOKEN_MINUS_MINUS, // --
|
|
TOKEN_SLASH, // /
|
|
TOKEN_PERC, // %
|
|
TOKEN_STAR, // *
|
|
TOKEN_AND, // &
|
|
TOKEN_HAT, // ^
|
|
TOKEN_PIPE, // |
|
|
TOKEN_EQ, // =
|
|
TOKEN_ARROW, // ->
|
|
TOKEN_LSHIFT, // <<
|
|
TOKEN_RSHIFT, // >>
|
|
TOKEN_DOUBLE_EQ, // ==
|
|
TOKEN_LESS_THAN, // <
|
|
TOKEN_GREATER_THAN, // >
|
|
TOKEN_LESS_EQ, // <=
|
|
TOKEN_GREATER_EQ, // >=
|
|
TOKEN_NOT_EQ, // !=
|
|
TOKEN_PLUS_EQ, // +=
|
|
TOKEN_MINUS_EQ, // -=
|
|
TOKEN_STAR_EQ, // *=
|
|
TOKEN_SLASH_EQ, // /=
|
|
TOKEN_AND_EQ, // &=
|
|
TOKEN_HAT_EQ, // ^=
|
|
TOKEN_PIPE_EQ, // |=
|
|
TOKEN_PERC_EQ, // %=
|
|
TOKEN_LSHIFT_EQ, // <<=
|
|
TOKEN_RSHIFT_EQ, // >>=
|
|
TOKEN_OR, // ||
|
|
TOKEN_DOUBLE_AND, // &&
|
|
TOKEN_COLON, // :
|
|
TOKEN_SEMICOLON, // ;
|
|
TOKEN_DOT, // .
|
|
TOKEN_BANG, // !
|
|
TOKEN_COMMA, // ,
|
|
TOKEN_LPAREN, // (
|
|
TOKEN_RPAREN, // )
|
|
TOKEN_LSQUARE, // [
|
|
TOKEN_RSQUARE, // ]
|
|
TOKEN_LCURLY, // {
|
|
TOKEN_RCURLY, // }
|
|
|
|
TOKEN_INTEGER,
|
|
TOKEN_FLOAT,
|
|
TOKEN_IDENTIFIER,
|
|
TOKEN_STRING,
|
|
TOKEN_CHAR,
|
|
|
|
TOKEN_GOTO,
|
|
TOKEN_LOOP,
|
|
TOKEN_IF,
|
|
TOKEN_ELSE,
|
|
TOKEN_SWITCH,
|
|
TOKEN_BREAK,
|
|
TOKEN_DO,
|
|
TOKEN_DEFER,
|
|
TOKEN_MODULE,
|
|
TOKEN_RETURN,
|
|
|
|
TOKEN_STATIC,
|
|
TOKEN_CONST,
|
|
TOKEN_EXTERN,
|
|
TOKEN_VOLATILE,
|
|
|
|
TOKEN_STRUCT,
|
|
TOKEN_ENUM,
|
|
TOKEN_UNION
|
|
} token_type;
|
|
|
|
typedef struct _token {
|
|
token_type type;
|
|
source_pos position;
|
|
char *lexeme;
|
|
usize lexeme_len;
|
|
struct _token *next;
|
|
} token;
|
|
|
|
typedef struct {
|
|
usize column, row, index, size;
|
|
char *source;
|
|
token *tokens;
|
|
token *tail;
|
|
arena *allocator;
|
|
} lexer;
|
|
|
|
lexer *lexer_init(char *source, usize size, arena *arena);
|
|
|
|
#endif
|