From 661055b2ea93896bc4895f5659ea11a5ca07b06a Mon Sep 17 00:00:00 2001 From: Himbeer Date: Sun, 1 Sep 2024 12:16:24 +0200 Subject: Implement remainder operator and assignment statement --- parse.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'parse.go') 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 -- cgit v1.2.3