mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 01:44:36 +00:00
170 lines
2.7 KiB
Odin
170 lines
2.7 KiB
Odin
package c_frontend_tokenizer
|
|
|
|
|
|
Pos :: struct {
|
|
file: string,
|
|
line: int,
|
|
column: int,
|
|
offset: int,
|
|
}
|
|
|
|
Token_Kind :: enum {
|
|
Invalid,
|
|
Ident,
|
|
Punct,
|
|
Keyword,
|
|
Char,
|
|
String,
|
|
Number,
|
|
PP_Number,
|
|
Comment,
|
|
EOF,
|
|
}
|
|
|
|
File :: struct {
|
|
name: string,
|
|
id: int,
|
|
src: []byte,
|
|
|
|
display_name: string,
|
|
line_delta: int,
|
|
}
|
|
|
|
|
|
Token_Type_Hint :: enum u8 {
|
|
None,
|
|
|
|
Int,
|
|
Long,
|
|
Long_Long,
|
|
|
|
Unsigned_Int,
|
|
Unsigned_Long,
|
|
Unsigned_Long_Long,
|
|
|
|
Float,
|
|
Double,
|
|
Long_Double,
|
|
|
|
UTF_8,
|
|
UTF_16,
|
|
UTF_32,
|
|
UTF_Wide,
|
|
}
|
|
|
|
Token_Value :: union {
|
|
i64,
|
|
f64,
|
|
string,
|
|
[]u16,
|
|
[]u32,
|
|
}
|
|
|
|
Token :: struct {
|
|
kind: Token_Kind,
|
|
next: ^Token,
|
|
lit: string,
|
|
|
|
pos: Pos,
|
|
file: ^File,
|
|
line_delta: int,
|
|
at_bol: bool,
|
|
has_space: bool,
|
|
|
|
type_hint: Token_Type_Hint,
|
|
val: Token_Value,
|
|
prefix: string,
|
|
|
|
// Preprocessor values
|
|
hide_set: ^Hide_Set,
|
|
origin: ^Token,
|
|
}
|
|
|
|
Is_Keyword_Proc :: #type proc(tok: ^Token) -> bool
|
|
|
|
copy_token :: proc(tok: ^Token) -> ^Token {
|
|
t, _ := new_clone(tok^)
|
|
t.next = nil
|
|
return t
|
|
}
|
|
|
|
new_eof :: proc(tok: ^Token) -> ^Token {
|
|
t, _ := new_clone(tok^)
|
|
t.kind = .EOF
|
|
t.lit = ""
|
|
return t
|
|
}
|
|
|
|
default_is_keyword :: proc(tok: ^Token) -> bool {
|
|
if tok.kind == .Keyword {
|
|
return true
|
|
}
|
|
if len(tok.lit) > 0 {
|
|
return default_keyword_set[tok.lit]
|
|
}
|
|
return false
|
|
}
|
|
|
|
|
|
token_name := [Token_Kind]string {
|
|
.Invalid = "invalid",
|
|
.Ident = "ident",
|
|
.Punct = "punct",
|
|
.Keyword = "keyword",
|
|
.Char = "char",
|
|
.String = "string",
|
|
.Number = "number",
|
|
.PP_Number = "preprocessor number",
|
|
.Comment = "comment",
|
|
.EOF = "eof",
|
|
}
|
|
|
|
default_keyword_set := map[string]bool{
|
|
"auto" = true,
|
|
"break" = true,
|
|
"case" = true,
|
|
"char" = true,
|
|
"const" = true,
|
|
"continue" = true,
|
|
"default" = true,
|
|
"do" = true,
|
|
"double" = true,
|
|
"else" = true,
|
|
"enum" = true,
|
|
"extern" = true,
|
|
"float" = true,
|
|
"for" = true,
|
|
"goto" = true,
|
|
"if" = true,
|
|
"int" = true,
|
|
"long" = true,
|
|
"register" = true,
|
|
"restrict" = true,
|
|
"return" = true,
|
|
"short" = true,
|
|
"signed" = true,
|
|
"sizeof" = true,
|
|
"static" = true,
|
|
"struct" = true,
|
|
"switch" = true,
|
|
"typedef" = true,
|
|
"union" = true,
|
|
"unsigned" = true,
|
|
"void" = true,
|
|
"volatile" = true,
|
|
"while" = true,
|
|
"_Alignas" = true,
|
|
"_Alignof" = true,
|
|
"_Atomic" = true,
|
|
"_Bool" = true,
|
|
"_Generic" = true,
|
|
"_Noreturn" = true,
|
|
"_Thread_local" = true,
|
|
"__restrict" = true,
|
|
"typeof" = true,
|
|
"asm" = true,
|
|
"__restrict__" = true,
|
|
"__thread" = true,
|
|
"__attribute__" = true,
|
|
}
|