Skip to content

Commit 929a249

Browse files
authored
Expression printer (#48)
* Expression printer
1 parent 818fa80 commit 929a249

File tree

8 files changed

+269
-51
lines changed

8 files changed

+269
-51
lines changed

ksmt-bitwuzla/src/main/kotlin/org/ksmt/solver/bitwuzla/KBitwuzlaExprConverter.kt

+15-14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.ksmt.decl.KFuncDecl
66
import org.ksmt.expr.KBitVecValue
77
import org.ksmt.expr.KExpr
88
import org.ksmt.expr.KFpRoundingMode
9+
import org.ksmt.expr.printer.ExpressionPrinter
910
import org.ksmt.expr.transformer.KNonRecursiveTransformer
1011
import org.ksmt.expr.transformer.KTransformerBase
1112
import org.ksmt.solver.bitwuzla.bindings.BitwuzlaBitVector
@@ -741,10 +742,10 @@ open class KBitwuzlaExprConverter(
741742
override val sort: KBv1Sort
742743
get() = ctx.bv1Sort
743744

744-
override fun print(builder: StringBuilder) {
745-
builder.append("(toBV1 ")
746-
arg.print(builder)
747-
builder.append(')')
745+
override fun print(printer: ExpressionPrinter) = with(printer) {
746+
append("(toBV1 ")
747+
append(arg)
748+
append(")")
748749
}
749750

750751
override fun accept(transformer: KTransformerBase): KExpr<KBv1Sort> {
@@ -757,10 +758,10 @@ open class KBitwuzlaExprConverter(
757758
override val sort: KBoolSort
758759
get() = ctx.boolSort
759760

760-
override fun print(builder: StringBuilder) {
761-
builder.append("(toBool ")
762-
arg.print(builder)
763-
builder.append(')')
761+
override fun print(printer: ExpressionPrinter) = with(printer) {
762+
append("(toBool ")
763+
append(arg)
764+
append(")")
764765
}
765766

766767
override fun accept(transformer: KTransformerBase): KExpr<KBoolSort> {
@@ -777,12 +778,12 @@ open class KBitwuzlaExprConverter(
777778
override val sort: KArraySort<ToDomain, ToRange>
778779
get() = ctx.mkArraySort(toDomainSort, toRangeSort)
779780

780-
override fun print(builder: StringBuilder) {
781-
builder.append("(toArray ")
782-
sort.print(builder)
783-
builder.append(' ')
784-
arg.print(builder)
785-
builder.append(')')
781+
override fun print(printer: ExpressionPrinter) = with(printer) {
782+
append("(toArray ")
783+
append("$sort")
784+
append(" ")
785+
append(arg)
786+
append(")")
786787
}
787788

788789
override fun accept(transformer: KTransformerBase): KExpr<KArraySort<ToDomain, ToRange>> {

ksmt-core/src/main/kotlin/org/ksmt/expr/Array.kt

+14-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.ksmt.KContext
44
import org.ksmt.decl.KArrayConstDecl
55
import org.ksmt.decl.KDecl
66
import org.ksmt.decl.KFuncDecl
7+
import org.ksmt.expr.printer.ExpressionPrinter
78
import org.ksmt.expr.transformer.KTransformerBase
89
import org.ksmt.sort.KArraySort
910
import org.ksmt.sort.KSort
@@ -89,10 +90,10 @@ class KFunctionAsArray<D : KSort, R : KSort> internal constructor(
8990
override val sort: KArraySort<D, R>
9091
get() = ctx.mkArraySort(domainSort, function.sort)
9192

92-
override fun print(builder: StringBuilder): Unit = with(builder) {
93+
override fun print(printer: ExpressionPrinter): Unit = with(printer) {
9394
append("(asArray ")
9495
append(function.name)
95-
append(')')
96+
append(")")
9697
}
9798

9899
override fun accept(transformer: KTransformerBase): KExpr<KArraySort<D, R>> = transformer.transform(this)
@@ -108,17 +109,20 @@ class KArrayLambda<D : KSort, R : KSort> internal constructor(
108109
val body: KExpr<R>
109110
) : KExpr<KArraySort<D, R>>(ctx) {
110111

111-
override fun print(builder: StringBuilder): Unit = with(builder) {
112-
append("(lambda ((")
113-
append(indexVarDecl.name)
114-
append(' ')
112+
override fun print(printer: ExpressionPrinter) {
113+
val str = buildString {
114+
append("(lambda ((")
115+
append(indexVarDecl.name)
116+
append(' ')
115117

116-
indexVarDecl.sort.print(this)
117-
append(")) ")
118+
indexVarDecl.sort.print(this)
119+
append(")) ")
118120

119-
body.print(this)
121+
body.print(this)
120122

121-
append(')')
123+
append(')')
124+
}
125+
printer.append(str)
122126
}
123127

124128
override fun accept(transformer: KTransformerBase): KExpr<KArraySort<D, R>> = transformer.transform(this)

ksmt-core/src/main/kotlin/org/ksmt/expr/KApp.kt

+21-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package org.ksmt.expr
22

33
import org.ksmt.KContext
44
import org.ksmt.decl.KDecl
5+
import org.ksmt.decl.KParameterizedFuncDecl
6+
import org.ksmt.expr.printer.ExpressionPrinter
57
import org.ksmt.expr.transformer.KTransformerBase
68
import org.ksmt.sort.KSort
79

@@ -14,22 +16,33 @@ abstract class KApp<T : KSort, A : KExpr<*>> internal constructor(ctx: KContext)
1416
@Deprecated("Use property", ReplaceWith("decl"))
1517
fun decl(): KDecl<T> = decl
1618

17-
override fun print(builder: StringBuilder): Unit = with(ctx) {
18-
with(builder) {
19+
override fun print(printer: ExpressionPrinter) {
20+
with(printer) {
1921
if (args.isEmpty()) {
20-
append(decl.name)
22+
append(decl)
2123
return
2224
}
2325

24-
append('(')
25-
append(decl.name)
26+
append("(")
27+
append(decl)
2628

2729
for (arg in args) {
28-
append(' ')
29-
arg.print(this)
30+
append(" ")
31+
append(arg)
3032
}
3133

32-
append(')')
34+
append(")")
35+
}
36+
}
37+
38+
private fun ExpressionPrinter.append(decl: KDecl<*>) {
39+
append(decl.name)
40+
if (decl is KParameterizedFuncDecl) {
41+
append(" (_")
42+
for (param in decl.parameters) {
43+
append(" $param")
44+
}
45+
append(")")
3346
}
3447
}
3548
}

ksmt-core/src/main/kotlin/org/ksmt/expr/KExpr.kt

+8
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package org.ksmt.expr
22

33
import org.ksmt.KAst
44
import org.ksmt.KContext
5+
import org.ksmt.expr.printer.ExpressionPrinter
56
import org.ksmt.expr.transformer.KTransformerBase
67
import org.ksmt.sort.KSort
8+
import org.ksmt.expr.printer.ExpressionPrinterWithLetBindings
79

810
abstract class KExpr<T : KSort>(ctx: KContext) : KAst(ctx) {
911

@@ -31,4 +33,10 @@ abstract class KExpr<T : KSort>(ctx: KContext) : KAst(ctx) {
3133
* @see [computeExprSort]
3234
* */
3335
open fun sortComputationExprDependency(dependency: MutableList<KExpr<*>>) {}
36+
37+
override fun print(builder: StringBuilder) {
38+
ExpressionPrinterWithLetBindings().print(this, builder)
39+
}
40+
41+
abstract fun print(printer: ExpressionPrinter)
3442
}

ksmt-core/src/main/kotlin/org/ksmt/expr/KQuantifier.kt

+18-13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.ksmt.expr
22

33
import org.ksmt.KContext
44
import org.ksmt.decl.KDecl
5+
import org.ksmt.expr.printer.ExpressionPrinter
56
import org.ksmt.sort.KBoolSort
67

78
abstract class KQuantifier(
@@ -14,21 +15,25 @@ abstract class KQuantifier(
1415

1516
abstract fun printQuantifierName(): String
1617

17-
override fun print(builder: StringBuilder): Unit = with(builder) {
18-
append('(')
19-
append(printQuantifierName())
20-
append('(')
21-
22-
bounds.forEach { bound ->
18+
override fun print(printer: ExpressionPrinter) {
19+
val str = buildString {
20+
append('(')
21+
append(printQuantifierName())
2322
append('(')
24-
append(bound.name)
25-
append(' ')
26-
bound.sort.print(this)
23+
24+
bounds.forEach { bound ->
25+
append('(')
26+
append(bound.name)
27+
append(' ')
28+
bound.sort.print(this)
29+
append(')')
30+
}
31+
32+
appendLine(')')
33+
body.print(this)
34+
appendLine()
2735
append(')')
2836
}
29-
30-
append(')')
31-
body.print(this)
32-
append(')')
37+
printer.append(str)
3338
}
3439
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.ksmt.expr.printer
2+
3+
import org.ksmt.expr.KExpr
4+
5+
interface ExpressionPrinter {
6+
/**
7+
* Append string as in StringBuilder.
8+
* */
9+
fun append(str: String)
10+
11+
/**
12+
* Append an expression.
13+
* */
14+
fun append(expr: KExpr<*>)
15+
}

0 commit comments

Comments
 (0)