165 lines
3.8 KiB
C
165 lines
3.8 KiB
C
#pragma once
|
|
|
|
typedef enum Token_Kind{
|
|
meta("End of stream")TK_End,
|
|
meta("*")TK_Mul,
|
|
meta("/")TK_Div,
|
|
meta("+")TK_Add,
|
|
meta("-")TK_Sub,
|
|
meta("%")TK_Mod,
|
|
meta("&")TK_BitAnd,
|
|
meta("|")TK_BitOr,
|
|
meta("^")TK_BitXor,
|
|
meta("~")TK_Neg,
|
|
meta("!")TK_Not,
|
|
meta("(")TK_OpenParen,
|
|
meta(")")TK_CloseParen,
|
|
meta("{")TK_OpenBrace,
|
|
meta("}")TK_CloseBrace,
|
|
meta("[")TK_OpenBracket,
|
|
meta("]")TK_CloseBracket,
|
|
meta(",")TK_Comma,
|
|
meta("#")TK_Pound,
|
|
meta("?")TK_Question,
|
|
meta("...")TK_ThreeDots,
|
|
meta(";")TK_Semicolon,
|
|
meta(".")TK_Dot,
|
|
meta("<")TK_LesserThen,
|
|
meta(">")TK_GreaterThen,
|
|
meta(":")TK_Colon,
|
|
meta("=")TK_Assign,
|
|
meta("/=")TK_DivAssign,
|
|
meta("*=")TK_MulAssign,
|
|
meta("%=")TK_ModAssign,
|
|
meta("-=")TK_SubAssign,
|
|
meta("+=")TK_AddAssign,
|
|
meta("&=")TK_AndAssign,
|
|
meta("|=")TK_OrAssign,
|
|
meta("^=")TK_XorAssign,
|
|
meta("<<=")TK_LeftShiftAssign,
|
|
meta(">>=")TK_RightShiftAssign,
|
|
meta("::")TK_DoubleColon,
|
|
meta("@")TK_At,
|
|
meta("--")TK_Decrement,
|
|
meta("++")TK_Increment,
|
|
meta("--")TK_PostDecrement,
|
|
meta("++")TK_PostIncrement,
|
|
meta("<=")TK_LesserThenOrEqual,
|
|
meta(">=")TK_GreaterThenOrEqual,
|
|
meta("==")TK_Equals,
|
|
meta("&&")TK_And,
|
|
meta("||")TK_Or,
|
|
meta("!=")TK_NotEquals,
|
|
meta("<<")TK_LeftShift,
|
|
meta(">>")TK_RightShift,
|
|
meta("->")TK_Arrow,
|
|
meta("sizeof")TK_ExprSizeof,
|
|
TK_DocComment,
|
|
TK_Comment,
|
|
TK_Identifier,
|
|
TK_StringLit,
|
|
TK_U8Lit,
|
|
TK_Error,
|
|
TK_Float,
|
|
TK_Int,
|
|
TK_Keyword,
|
|
}Token_Kind;
|
|
|
|
typedef struct Token{
|
|
Token_Kind kind;
|
|
union{
|
|
struct{
|
|
U8 *str;
|
|
S64 len;
|
|
};
|
|
String string;
|
|
};
|
|
union {
|
|
S64 int_val;
|
|
String error_val;
|
|
};
|
|
|
|
String file;
|
|
S64 line;
|
|
U8 *line_begin;
|
|
} Token;
|
|
|
|
typedef struct Tokens{
|
|
Token *tokens;
|
|
S64 len;
|
|
S64 cap;
|
|
}Tokens;
|
|
|
|
typedef struct Lex_Stream{
|
|
U8 *stream;
|
|
U8 *line_begin;
|
|
String filename;
|
|
S64 line;
|
|
}Lex_Stream;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
global String token_kind_string[] = {
|
|
[TK_End] = lit("End of stream"),
|
|
[TK_Error] = lit("Error"),
|
|
[TK_Comment] = lit("Comment"),
|
|
[TK_Identifier] = lit("Identifier"),
|
|
[TK_StringLit] = lit("StringLiteral"),
|
|
[TK_U8Lit] = lit("U8Literal"),
|
|
[TK_Float] = lit("Float"),
|
|
[TK_Int] = lit("Integer"),
|
|
[TK_Mul] = lit("*"),
|
|
[TK_Div] = lit("/"),
|
|
[TK_Add] = lit("+"),
|
|
[TK_Sub] = lit("-"),
|
|
[TK_Mod] = lit("%"),
|
|
[TK_BitAnd] = lit("&"),
|
|
[TK_BitOr] = lit("|"),
|
|
[TK_BitXor] = lit("^"),
|
|
[TK_Neg] = lit("~"),
|
|
[TK_Not] = lit("!"),
|
|
[TK_OpenParen] = lit("("),
|
|
[TK_CloseParen] = lit(")"),
|
|
[TK_OpenBrace] = lit("{"),
|
|
[TK_CloseBrace] = lit("}"),
|
|
[TK_OpenBracket] = lit("["),
|
|
[TK_CloseBracket] = lit("]"),
|
|
[TK_Comma] = lit(","),
|
|
[TK_Pound] = lit("#"),
|
|
[TK_Question] = lit("?"),
|
|
[TK_ThreeDots] = lit("..."),
|
|
[TK_Semicolon] = lit(";"),
|
|
[TK_Dot] = lit("."),
|
|
[TK_LesserThen] = lit("<"),
|
|
[TK_GreaterThen] = lit(">"),
|
|
[TK_Colon] = lit(":"),
|
|
[TK_Assign] = lit("="),
|
|
[TK_DivAssign] = lit("/="),
|
|
[TK_MulAssign] = lit("*="),
|
|
[TK_ModAssign] = lit("%="),
|
|
[TK_SubAssign] = lit("-="),
|
|
[TK_AddAssign] = lit("+="),
|
|
[TK_AndAssign] = lit("&="),
|
|
[TK_OrAssign] = lit("|="),
|
|
[TK_XorAssign] = lit("^="),
|
|
[TK_LeftShiftAssign] = lit("<<="),
|
|
[TK_RightShiftAssign] = lit(">>="),
|
|
[TK_DoubleColon] = lit("::"),
|
|
[TK_At] = lit("@"),
|
|
[TK_Decrement] = lit("--"),
|
|
[TK_Increment] = lit("++"),
|
|
[TK_PostDecrement] = lit("--"),
|
|
[TK_PostIncrement] = lit("++"),
|
|
[TK_LesserThenOrEqual] = lit("<="),
|
|
[TK_GreaterThenOrEqual] = lit(">="),
|
|
[TK_Equals] = lit("=="),
|
|
[TK_And] = lit("&&"),
|
|
[TK_Or] = lit("||"),
|
|
[TK_NotEquals] = lit("!="),
|
|
[TK_LeftShift] = lit("<<"),
|
|
[TK_RightShift] = lit(">>"),
|
|
[TK_Arrow] = lit("->"),
|
|
[TK_ExprSizeof] = lit("sizeof"),
|
|
};
|