diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-01 12:16:24 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-01 12:16:24 +0200 |
commit | 661055b2ea93896bc4895f5659ea11a5ca07b06a (patch) | |
tree | f88c2809b84c35bbcfc4afef1ce13609333b8bea /parse.go | |
parent | a7a15e1193b09414316fea40d6999f47bc0f57d4 (diff) |
Implement remainder operator and assignment statement
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 55 |
1 files changed, 54 insertions, 1 deletions
@@ -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 |