diff options
author | Suleyman Farajli <suleyman@farajli.net> | 2024-12-15 16:28:48 +0400 |
---|---|---|
committer | Suleyman Farajli <suleyman@farajli.net> | 2024-12-15 16:28:48 +0400 |
commit | 68c2dae099a5073d1d6c8643fc07b7a90a5e2002 (patch) | |
tree | 21275840f0a78c79a178cf2f309a1c277fe403e2 /src/main.go |
first commit
Diffstat (limited to 'src/main.go')
-rw-r--r-- | src/main.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..f831ec8 --- /dev/null +++ b/src/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "fmt" + "strconv" + "regexp" + "os" +) + +func readfile(path string) []string { + + var raw []string; + reg := regexp.MustCompile(" |\n") + + dat, err := os.ReadFile(path); + if (err != nil) { + panic("failed to read file"); + } + + /* FIXME: Find a better solution */ + tmp := reg.Split(string(dat), -1); + + for i := range tmp{ + if tmp[i] != "" { + raw = append(raw, tmp[i]); + } + }; + + return raw; +} + +func interpret(raw[]string) { + var err error; + var number int; + var stack[]int; + + for i := 0; i < len(raw); i++ { + length := len(stack); + number, err = strconv.Atoi(raw[i]); + if err == nil { + stack = append(stack, number); + continue; + } + + switch raw[i] { + case "+": + if length < 2 { + panic("failed to plus: stack underflow"); + } + stack[length - 2] = stack[length - 1] + stack[length - 2] + stack = stack[:length - 1]; + case "-": + if length < 2 { + panic("failed to minus: stack underflow"); + } + stack[length - 2] = stack[length - 1] - stack[length - 2] + stack = stack[:length - 1]; + case ".": + if length < 1 { + panic("failed to dump: stack underflow"); + } + fmt.Println(stack[length - 1]); + stack = stack[:length - 1]; + default: + panic("invalid word"); + } + } +} + +func main() { + var file string; + argv := os.Args; + argc := len(argv); + compile_flg := false; + + switch argc { + case 3: + if argv[1] != "-S" { + panic("Invalid usage"); + } + compile_flg = true; + fallthrough; + case 2: + file = argv[argc - 1]; + default: + panic("Invaid usage"); + } + + output := readfile(file); + if (compile_flg) { + panic("Not Implemented"); + } else { + interpret(output); + } +} |