wacc/lexer.h
2023-03-06 01:47:12 +01:00

133 lines
3.2 KiB
C

#ifndef LEXER_H
#define LEXER_H
#include <stdbool.h>
#include <stddef.h>
typedef enum {
TokenTypeEof,
TokenTypeInvalidChar,
TokenTypeMalformedMultilineComment,
TokenTypeMalformedChar,
TokenTypeMalformedString,
TokenTypeId,
TokenTypeInt,
TokenTypeIntDoubleDot,
TokenTypeHex,
TokenTypeBinary,
TokenTypeFloat,
TokenTypeChar,
TokenTypeString,
TokenTypeIf,
TokenTypeElse,
TokenTypeLoop,
TokenTypeWhile,
TokenTypeFor,
TokenTypeIn,
TokenTypeBreak,
TokenTypeLet,
TokenTypeMatch,
TokenTypeFalse,
TokenTypeTrue,
TokenTypeNot,
TokenTypeAnd,
TokenTypeOr,
TokenTypeFn,
TokenTypeReturn,
TokenTypeMut,
TokenTypeDefer,
TokenTypeLParen,
TokenTypeRParen,
TokenTypeLBrace,
TokenTypeRBrace,
TokenTypeLBracket,
TokenTypeRBracket,
TokenTypeComma,
TokenTypeColon,
TokenTypeDoubleColon,
TokenTypeDoubleColonLt,
TokenTypeSemicolon,
TokenTypeAmpersand,
TokenTypeUnderscore,
TokenTypeDot,
TokenTypeDoubleDot,
TokenTypeDoubleDotEqual,
TokenTypeDoubleDotLt,
TokenTypePlusEqual,
TokenTypeMinusEqual,
TokenTypeAsteriskEqual,
TokenTypeSlashEqual,
TokenTypePercentEqual,
TokenTypeDoubleEqual,
TokenTypeExclamationEqual,
TokenTypeLtEqual,
TokenTypeGtEqual,
TokenTypePlus,
TokenTypeMinus,
TokenTypeAsterisk,
TokenTypeSlash,
TokenTypePercent,
TokenTypeEqual,
TokenTypeExclamation,
TokenTypeLt,
TokenTypeGt,
} TokenType;
const char* token_type_to_string(TokenType type);
typedef struct {
size_t index;
int line, column;
} Position;
typedef struct {
TokenType type;
Position position;
size_t length;
} Token;
char* token_string(const Token* token, const char* text);
char* token_to_string(const Token* token, const char* text);
typedef struct {
const char* text;
size_t index, length;
int line, column;
} Lexer;
void lexer_create(Lexer* lexer, const char* text, size_t text_length);
Token lexer_next(Lexer* lexer);
char* lexer_token_string(const Lexer* lexer, const Token* token);
Token lexer_skip_whitespace(Lexer* lexer);
Token lexer_make_int_or_float(Lexer* lexer);
Token lexer_make_id(Lexer* lexer);
bool lexer_span_matches(const Lexer* lexer, Position begin, const char* value);
Token lexer_make_static_token(Lexer* lexer);
Token lexer_make_int_hex_binary_or_float(Lexer* lexer);
Token lexer_make_char(Lexer* lexer);
Token lexer_make_string(Lexer* lexer);
void lexer_skip_literal_char(Lexer* lexer);
Token lexer_make_single_char_token(Lexer* lexer, TokenType type);
Token lexer_make_dot_token(Lexer* lexer);
Token lexer_make_colon_token(Lexer* lexer);
Token lexer_make_slash_token(Lexer* lexer);
Token lexer_skip_singleline_comment(Lexer* lexer);
Token lexer_make_single_or_double_char_token(Lexer* lexer,
TokenType single_type, char second_char, TokenType double_type);
Token lexer_skip_multiline_comment(Lexer* lexer);
Token lexer_make_invalid_char(Lexer* lexer);
Position lexer_position(const Lexer* lexer);
Token lexer_token(const Lexer* lexer, TokenType type, Position begin);
bool lexer_done(const Lexer* lexer);
char lexer_current(const Lexer* lexer);
void lexer_step(Lexer* lexer);
#endif