From 882f1b637b677223e4e9cf1b4e9639ac5f97b615 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 3 Feb 2025 18:42:24 +1300 Subject: [PATCH] first commit --- .gitignore | 1 + compiler | Bin 0 -> 31680 bytes main.odin | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ odinfmt.json | 5 +++ test.txt | 1 + 5 files changed, 131 insertions(+) create mode 100644 .gitignore create mode 100644 compiler create mode 100644 main.odin create mode 100644 odinfmt.json create mode 100644 test.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b883f1f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/compiler b/compiler new file mode 100644 index 0000000000000000000000000000000000000000..0c36b4a3391b568bdd9de80125f97b8acd95b114 GIT binary patch literal 31680 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 literal 0 HcmV?d00001 diff --git a/main.odin b/main.odin new file mode 100644 index 0000000..ede1711 --- /dev/null +++ b/main.odin @@ -0,0 +1,124 @@ +package main + +import "core:fmt" +import "core:log" +import "core:os" +import "core:strconv" +import "core:text/regex" + +String :: struct { + value: string, +} + +Name :: struct { + value: string, +} + +Number :: struct { + value: u64, +} + +Left_Paren :: struct {} +Right_Paren :: struct {} +Comma :: struct {} + +Token :: union { + String, + Name, + Number, + Left_Paren, + Right_Paren, + Comma, +} + +Populator_Proc :: proc(value: string) -> Token + +Token_Desc :: struct { + regex_comp: regex.Regular_Expression, + populator_proc: Populator_Proc, +} + +Tokenizer :: struct { + token_descs: [dynamic]Token_Desc, +} + +tokenizer_add_token :: proc( + tokenizer: ^Tokenizer, + regex_string: string, + populator_proc: Populator_Proc, +) -> regex.Error { + append( + &tokenizer.token_descs, + Token_Desc{regex_comp = regex.create(regex_string) or_return, populator_proc = populator_proc}, + ) + + return nil +} + +tokenizer_create :: proc() -> (tokenizer: Tokenizer, err: regex.Error) { + tokenizer_add_token(&tokenizer, "^\\d+", proc(value: string) -> Token { + parsed, _ := strconv.parse_u64(value) + return Number{value = parsed} + }) or_return + + tokenizer_add_token(&tokenizer, "^\".*?\"", proc(value: string) -> Token { + return String{value = value[1:len(value) - 1]} + }) or_return + + tokenizer_add_token(&tokenizer, "^\\w+", proc(value: string) -> Token { + return Name{value = value} + }) or_return + + tokenizer_add_token(&tokenizer, "^\\(", proc(_: string) -> Token {return Left_Paren{}}) or_return + tokenizer_add_token(&tokenizer, "^\\)", proc(_: string) -> Token {return Right_Paren{}}) or_return + tokenizer_add_token(&tokenizer, "^,", proc(_: string) -> Token {return Comma{}}) or_return + + return +} + +tokenize :: proc(tokenizer: Tokenizer, input: string) -> []Token { + tokens: [dynamic]Token + + i := 0 + loop: for true { + for reg in tokenizer.token_descs { + if i >= len(input) { + break loop + } + + capture, matched := regex.match(reg.regex_comp, input[i:]) + if matched { + token := reg.populator_proc(input[i:i + capture.pos[0][1]]) + append(&tokens, token) + i += capture.pos[0][1] + continue loop + } + } + + i += 1 + } + + return tokens[:] +} + +main :: proc() { + context.logger = log.create_console_logger() + + bytes, ok := os.read_entire_file(os.args[1]) + if !ok { + log.fatal("Failed to read file") + return + } + input := string(bytes) + + tokenizer, err := tokenizer_create() + if err != nil { + log.fatal(err) + return + } + + tokens := tokenize(tokenizer, input) + for token in tokens { + fmt.println(token) + } +} diff --git a/odinfmt.json b/odinfmt.json new file mode 100644 index 0000000..4137bac --- /dev/null +++ b/odinfmt.json @@ -0,0 +1,5 @@ +{ + "character_width": 110, + "tabs": false, + "tabs_width": 4 +} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..1d0cc8d --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +say_hi("bob", 26)