summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSuleyman Farajli <suleyman@farajli.net>2025-01-01 21:44:05 +0400
committerSuleyman Farajli <suleyman@farajli.net>2025-01-01 21:44:05 +0400
commitb25dee3a5a1893775f187734280f8a99a02df02b (patch)
tree6acc3471966becc0aef215edca6c667870aac436 /src
parentc5887ca055da4f46f72b5633476a310928477b43 (diff)
initial `const` added
Diffstat (limited to 'src')
-rw-r--r--src/main.go36
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
}