diff options
author | Suleyman Farajli <suleyman@farajli.net> | 2025-01-01 21:44:05 +0400 |
---|---|---|
committer | Suleyman Farajli <suleyman@farajli.net> | 2025-01-01 21:44:05 +0400 |
commit | b25dee3a5a1893775f187734280f8a99a02df02b (patch) | |
tree | 6acc3471966becc0aef215edca6c667870aac436 /src | |
parent | c5887ca055da4f46f72b5633476a310928477b43 (diff) |
initial `const` added
Diffstat (limited to 'src')
-rw-r--r-- | src/main.go | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/main.go b/src/main.go index d82a3ca..c636516 100644 --- a/src/main.go +++ b/src/main.go @@ -23,6 +23,12 @@ type Token struct { offset int } +type Word struct { + typ string + name string + tokens[] Token +} + /* TODO: add validate function for error checking */ func tokenize(path string) []Token { @@ -81,7 +87,7 @@ func parse(tokens[]Token) []Operation { var looplabels[] int var looplabel int = 0 var stringlabel int = 0 - var constants[][2] string + var externalWords[] Word; for i := 0; i < len(tokens); i++ { var op Operation @@ -137,12 +143,21 @@ func parse(tokens[]Token) []Operation { op.crosslabel = fmt.Sprintf(".loop%d", looplabels[len(looplabels) - 1]) op.label = fmt.Sprintf(".done%d", looplabels[len(looplabels) - 1]) looplabels = looplabels[:len(looplabels) - 1] + case "const": - if (i + 2 >= len(tokens)) { + if i + 2 >= len(tokens) { /* FIXME: Better error message */ - panic("invalid const") + panic("invalid const usage") } - constants = append(constants, [2]string{tokens[i + 1].str, tokens[i + 2].str}) + name := tokens[i + 1].str + token := tokens[i + 2] + _, err := strconv.Atoi(token.str) + /* FIXME: add character as well */ + if err != nil && token.str[0] != '"' { + /* FIXME: Better error message */ + panic("Can only define strings and numbers with const") + } + externalWords = append(externalWords, Word{typ: "const", name: name, tokens: []Token{token}}) i += 2 continue } @@ -168,11 +183,15 @@ func parse(tokens[]Token) []Operation { op.name = "syscall" op.intData = parameters } - for y:= 0; y < len(constants); y++ { - if tokens[i].str == constants[y][0] { - op.name = "constant" - op.strData = constants[y][1] + + for y := 0; y < len(externalWords); y++ { + if tokens[i].str != externalWords[y].name { + continue } + opsBuf := parse(externalWords[y].tokens) + ops = append(ops, opsBuf...) + /* FIXME: Find an alternative to goto */ + goto done } if op.name == "" { @@ -180,6 +199,7 @@ func parse(tokens[]Token) []Operation { } ops = append(ops, op) +done: } return ops } |