From 13efaa5e170dfb38a8f4f2f8a23ebe804d49ea4a Mon Sep 17 00:00:00 2001 From: Nocturn9x Date: Fri, 15 Oct 2021 15:19:23 +0200 Subject: [PATCH] Added constant folding for string multiplication --- src/backend/optimizer.nim | 21 +++++++++++++++++++++ src/main.nim | 1 + 2 files changed, 22 insertions(+) diff --git a/src/backend/optimizer.nim b/src/backend/optimizer.nim index cd4fe0d..f09c756 100644 --- a/src/backend/optimizer.nim +++ b/src/backend/optimizer.nim @@ -17,6 +17,7 @@ import meta/token import parseutils import strformat +import strutils import math @@ -240,6 +241,26 @@ proc optimizeBinary(self: Optimizer, node: BinaryExpr): ASTNode = result = StrExpr(kind: strExpr, literal: Token(kind: String, lexeme: "'" & a.literal.lexeme[1..<(^1)] & b.literal.lexeme[1..<(^1)] & "'", pos: (start: -1, stop: -1))) else: result = node + elif a.kind == strExpr and self.optimizeNode(b).kind == intExpr and not (self.warnings.len() > 0 and self.warnings[^1].kind == valueOverflow and self.warnings[^1].node == b): + var a = StrExpr(a) + var b = IntExpr(b) + var bb: int + discard parseInt(b.literal.lexeme, bb) + case node.operator.kind: + of Asterisk: + result = StrExpr(kind: strExpr, literal: Token(kind: String, lexeme: "'" & a.literal.lexeme[1..<(^1)].repeat(bb) & "'")) + else: + result = node + elif b.kind == strExpr and self.optimizeNode(a).kind == intExpr and not (self.warnings.len() > 0 and self.warnings[^1].kind == valueOverflow and self.warnings[^1].node == a): + var b = StrExpr(b) + var a = IntExpr(a) + var aa: int + discard parseInt(a.literal.lexeme, aa) + case node.operator.kind: + of Asterisk: + result = StrExpr(kind: strExpr, literal: Token(kind: String, lexeme: "'" & b.literal.lexeme[1..<(^1)].repeat(aa) & "'")) + else: + result = node else: # There's no constant folding we can do! result = node diff --git a/src/main.nim b/src/main.nim index f45fca0..1b42b15 100644 --- a/src/main.nim +++ b/src/main.nim @@ -24,6 +24,7 @@ var tokens: seq[Token] var tree: seq[ASTNode] var optimized: tuple[tree: seq[ASTNode], warnings: seq[Warning]] + echo "NimVM REPL\n" while true: try: