New approach, new lexer

This commit is contained in:
Krzosa Karol
2022-05-06 10:13:16 +02:00
parent 557dde1936
commit e3b5e9b33a
33 changed files with 3331 additions and 784 deletions

200
lex.h
View File

@@ -1,107 +1,115 @@
#pragma once
typedef struct Intern_String{
String s;
}Intern_String;
#pragma once
#if 0
Intern_String :: struct {
s: String;
}
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_Character,
TK_Error,
TK_Float,
TK_Int,
TK_Keyword,
@prefix = "TK_"
Token_Kind :: enum {
@str = "End of stream" End,
@str = "*" Mul,
@str = "/" Div,
@str = "+" Add,
@str = "-" Sub,
@str = "%" Mod,
@str = "&" BitAnd,
@str = "|" BitOr,
@str = "^" BitXor,
@str = "~" Neg,
@str = "!" Not,
@str = "(" OpenParen,
@str = " " CloseParen,
@str = "{" OpenBrace,
@str = "}" CloseBrace,
@str = "[" OpenBracket,
@str = "]" CloseBracket,
@str = "," Comma,
@str = "#" Pound,
@str = "?" Question,
@str = "..." ThreeDots,
@str = ";" Semicolon,
@str = "." Dot,
@str = "<" LesserThen,
@str = ">" GreaterThen,
@str = ":" Colon,
@str = "=" Assign,
@str = "/=" DivAssign,
@str = "*=" MulAssign,
@str = "%=" ModAssign,
@str = "-=" SubAssign,
@str = "+=" AddAssign,
@str = "&=" AndAssign,
@str = "|=" OrAssign,
@str = "^=" XorAssign,
@str = "<<=" LeftShiftAssign,
@str = ">>=" RightShiftAssign,
@str = "::" DoubleColon,
@str = "@" At,
@str = "--" Decrement,
@str = "++" Increment,
@str = "--" PostDecrement,
@str = "++" PostIncrement,
@str = "<=" LesserThenOrEqual,
@str = ">=" GreaterThenOrEqual,
@str = "==" Equals,
@str = "&&" And,
@str = "||" Or,
@str = "!=" NotEquals,
@str = "<<" LeftShift,
@str = ">>" RightShift,
@str = "->" Arrow,
@str = "sizeof" ExprSizeof,
DocComment,
Comment,
Identifier,
StringLit,
U8Lit,
Character,
Error,
Float,
Int,
Keyword,
}Token_Kind;
typedef struct Token{
Token_Kind kind;
union{
struct{
U8 *str;
S64 len;
};
String string;
};
@array(type=block)
Token :: struct{
kind: Token_Kind;
union {
S64 int_val;
String error_val;
Intern_String intern_val;
};
struct{
str: U8*;
len: S64;
}
string: String;
}
union {
int_val: S64;
error_val: String;
intern_val: Intern_String;
}
String file;
S64 line;
U8 *line_begin;
} Token;
file: String;
line: S64;
line_begin: U8*;
}
typedef struct Tokens{
Token *tokens;
S64 len;
S64 cap;
S64 iter;
}Tokens;
Lex_Stream :: struct{
stream: U8 *;
line_begin: U8 *;
filename: String;
line: S64;
}
typedef struct Lex_Stream{
U8 *stream;
U8 *line_begin;
String filename;
S64 line;
}Lex_Stream;
Tokens :: struct{
tokens: Token*;
len: S64;
cap: S64;
iter: S64;
}
#endif
#include "generated_lex.h"
#include "generated_lex.cpp"
//-----------------------------------------------------------------------------
//