aboutsummaryrefslogtreecommitdiff
path: root/parse.go
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-09-01 12:16:24 +0200
committerHimbeer <himbeer@disroot.org>2024-09-01 12:16:24 +0200
commit661055b2ea93896bc4895f5659ea11a5ca07b06a (patch)
treef88c2809b84c35bbcfc4afef1ce13609333b8bea /parse.go
parenta7a15e1193b09414316fea40d6999f47bc0f57d4 (diff)
Implement remainder operator and assignment statement
Diffstat (limited to 'parse.go')
-rw-r--r--parse.go55
1 files changed, 54 insertions, 1 deletions
diff --git a/parse.go b/parse.go
index f15ac0a..321c679 100644
--- a/parse.go
+++ b/parse.go
@@ -382,6 +382,14 @@ func parseAssignment(toks *tokens) (assignmentStmt, error) {
return divAssign, nil
}
+ remAssign, err := parseRemAssignStmt(toks)
+ if err != nil {
+ return nil, err
+ }
+ if remAssign != nil {
+ return remAssign, nil
+ }
+
return nil, nil
}
@@ -598,6 +606,37 @@ func parseDivAssignStmt(toks *tokens) (*divAssignStmt, error) {
}, nil
}
+func parseRemAssignStmt(toks *tokens) (*remAssignStmt, error) {
+ nameTok, ok := toks.consumeToken()
+ if !ok {
+ return nil, unexpectedEOF
+ }
+ if nameTok.kind != identifier {
+ toks.unreadToken()
+ return nil, nil
+ }
+
+ ok, err := toks.match(percentageEquals)
+ if err != nil {
+ return nil, err
+ }
+ if !ok {
+ toks.unreadTokens(2)
+ return nil, nil
+ }
+
+ expr, err := parseExpression(toks)
+ if err != nil {
+ return nil, err
+ }
+
+ return &remAssignStmt{
+ name: nameTok.value,
+ value: expr,
+ ln: nameTok.line,
+ }, nil
+}
+
func parseExpression(toks *tokens) (exprExpr, error) {
return parseEquality(toks)
}
@@ -880,7 +919,19 @@ func parseFactorRhs(toks *tokens) (*factorRhs, error) {
if err != nil {
return nil, err
}
- if !div {
+ }
+ var rem bool
+ if !mul && !div {
+ toks.unreadToken()
+ if mul {
+ toks.unreadToken()
+ }
+
+ rem, err = toks.match(percentage)
+ if err != nil {
+ return nil, err
+ }
+ if !rem {
toks.unreadToken()
return nil, nil
}
@@ -896,6 +947,8 @@ func parseFactorRhs(toks *tokens) (*factorRhs, error) {
op = multiply
} else if div {
op = divide
+ } else if rem {
+ op = remainder
}
return &factorRhs{op: op, value: value}, nil