Skip to content

Commit f5640e3

Browse files
committed
Implement simplifications for replace string expressions
1 parent f5bd81b commit f5640e3

4 files changed

Lines changed: 42 additions & 15 deletions

File tree

ksmt-core/src/main/kotlin/Main.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

ksmt-core/src/main/kotlin/io/ksmt/expr/rewrite/simplify/StringSimplification.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ fun KContext.simplifyStringReplace(
8989
arg0: KExpr<KStringSort>,
9090
arg1: KExpr<KStringSort>,
9191
arg2: KExpr<KStringSort>
92-
): KExpr<KStringSort> = mkStringReplaceNoSimplify(arg0, arg1, arg2) // Temporarily
92+
): KExpr<KStringSort> = simplifyStringReplaceExprBasic(arg0, arg1, arg2, ::mkStringReplaceNoSimplify)
9393

9494
fun KContext.simplifyStringReplaceAll(
9595
arg0: KExpr<KStringSort>,
9696
arg1: KExpr<KStringSort>,
9797
arg2: KExpr<KStringSort>
98-
): KExpr<KStringSort> = mkStringReplaceAllNoSimplify(arg0, arg1, arg2) // Temporarily
98+
): KExpr<KStringSort> = simplifyStringReplaceAllExprBasic(arg0, arg1, arg2, ::mkStringReplaceAllNoSimplify)
9999

100100
fun KContext.simplifyStringReplaceWithRegex(
101101
arg0: KExpr<KStringSort>,

ksmt-core/src/main/kotlin/io/ksmt/expr/rewrite/simplify/StringSimplificationRules.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,30 @@ inline fun KContext.simplifyStringBasicContainsExpr(
170170
cont(arg0, arg1)
171171
}
172172

173+
/*
174+
* String replace expressions simplifications
175+
* */
176+
177+
inline fun KContext.simplifyStringReplaceExprBasic(
178+
arg0: KExpr<KStringSort>,
179+
arg1: KExpr<KStringSort>,
180+
arg2: KExpr<KStringSort>,
181+
cont: (KExpr<KStringSort>, KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>
182+
): KExpr<KStringSort> =
183+
tryEvalStringLiteralOperation(arg0, arg1, arg2, { a0, a1, a2 -> StringUtils.strintReplace(a0, a1, a2) }) {
184+
cont(arg0, arg1, arg2)
185+
}
186+
187+
inline fun KContext.simplifyStringReplaceAllExprBasic(
188+
arg0: KExpr<KStringSort>,
189+
arg1: KExpr<KStringSort>,
190+
arg2: KExpr<KStringSort>,
191+
cont: (KExpr<KStringSort>, KExpr<KStringSort>, KExpr<KStringSort>) -> KExpr<KStringSort>
192+
): KExpr<KStringSort> =
193+
tryEvalStringLiteralOperation(arg0, arg1, arg2, { a0, a1, a2 -> StringUtils.strintReplaceAll(a0, a1, a2) }) {
194+
cont(arg0, arg1, arg2)
195+
}
196+
173197
/*
174198
* String to lower/upper case expression simplifications
175199
* */

ksmt-core/src/main/kotlin/io/ksmt/utils/StringUtils.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,20 @@ object StringUtils {
9191
mkIntNum(-1)
9292
}
9393
}
94+
95+
@JvmStatic
96+
fun strintReplace(arg0: KStringLiteralExpr, arg1: KStringLiteralExpr, arg2: KStringLiteralExpr): KStringLiteralExpr = with(arg0.ctx) {
97+
val str = arg0.value
98+
val search = arg1.value
99+
val replace = arg2.value
100+
return mkStringLiteral(if (search.isEmpty()) (replace + str) else str.replaceFirst(search, replace))
101+
}
102+
103+
@JvmStatic
104+
fun strintReplaceAll(arg0: KStringLiteralExpr, arg1: KStringLiteralExpr, arg2: KStringLiteralExpr): KStringLiteralExpr = with(arg0.ctx) {
105+
val str = arg0.value
106+
val search = arg1.value
107+
val replace = arg2.value
108+
return mkStringLiteral(if (search.isEmpty()) str else str.replace(search, replace))
109+
}
94110
}

0 commit comments

Comments
 (0)