Added constant folding for string multiplication

This commit is contained in:
Nocturn9x 2021-10-15 15:19:23 +02:00
parent f2cc2d0ef4
commit 13efaa5e17
2 changed files with 22 additions and 0 deletions

View File

@ -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

View File

@ -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: