summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSuleyman Farajli <suleyman@farajli.net>2024-12-23 22:35:51 +0400
committerSuleyman Farajli <suleyman@farajli.net>2024-12-23 22:35:51 +0400
commitd684b0ee2f142bdde5539cb0899949d4358cb115 (patch)
tree4a87ff978d9cf92eb0c51f6380535af9d6319293 /src
parent70dbdc4105dbd508d9e21ef7591acc0deb05d1c6 (diff)
interpreter removed only compile is supported
Diffstat (limited to 'src')
-rw-r--r--src/main.go93
1 files changed, 12 insertions, 81 deletions
diff --git a/src/main.go b/src/main.go
index 6568142..1773c2a 100644
--- a/src/main.go
+++ b/src/main.go
@@ -2,11 +2,12 @@ package main
import (
"fmt"
- "strconv"
"regexp"
"os"
)
+var print = fmt.Println
+
func readfile(path string) []string {
var raw []string;
@@ -29,93 +30,23 @@ func readfile(path string) []string {
return raw;
}
-func interpret(raw[]string) {
- var err error;
- var number int;
- var stack[]int;
- var skip_to_end bool;
-
- for i := 0; i < len(raw); i++ {
- length := len(stack);
- /* Conditional looping */
- if (skip_to_end && raw[i] != "end") {
- continue;
- }
- 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 < 2 {
- panic("failed to check equality: stack underflow");
- }
- if (stack[length - 1] == stack[length - 2]) {
- stack = append(stack, -1);
- } else {
- stack = append(stack, 0);
- }
-
- case ".":
- if length < 1 {
- panic("failed to dump: stack underflow");
- }
- fmt.Println(stack[length - 1]);
- stack = stack[:length - 1];
- case "if":
- if length < 1 {
- panic("failed to if: stack underflow");
- }
- if (stack[length - 1] == 0) {
- skip_to_end = true;
- }
- stack = stack[:length - 1];
- case "end":
- skip_to_end = false;
-
- default:
- panic("invalid word");
- }
- }
+func compile(raw[]string) {
+ print("section .text")
+ print("global _start")
+ print("_start:")
+ print("mov rdi, 0")
+ print("mov rax, 60")
+ print("syscall")
}
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:
+ if (argc != 2) {
panic("Invaid usage");
}
- output := readfile(file);
- if (compile_flg) {
- panic("Not Implemented");
- } else {
- interpret(output);
- }
+ raw := readfile(argv[argc - 1])
+ compile(raw);
}