New approach, new lexer
This commit is contained in:
200
lex.h
200
lex.h
@@ -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"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user