diff --git a/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/RegexAutomaton.java b/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/RegexAutomaton.java index f658523ed..cf14b3ddf 100644 --- a/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/RegexAutomaton.java +++ b/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/RegexAutomaton.java @@ -466,4 +466,8 @@ public RegexAutomaton repeat(long n) { return emptyString(); return toRegex().simplify().repeat(n).toAutomaton(this).minimize(); } + + public RegexAutomaton trim() { + return toRegex().trim().toAutomaton(this); + } } diff --git a/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/Tarsis.java b/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/Tarsis.java index 2b9ecff46..482634193 100644 --- a/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/Tarsis.java +++ b/lisa/lisa-analyses/src/main/java/it/unive/lisa/analysis/string/tarsis/Tarsis.java @@ -424,4 +424,8 @@ else if (intv.interval.isFinite()) { } else return new Tarsis(a.repeat(intv.interval.getLow().toLong()).concat(a.star())); } + + public Tarsis trim() { + return new Tarsis(this.a.trim()); + } } diff --git a/lisa/lisa-analyses/src/test/java/it/unive/lisa/analysis/string/tarsis/TrimTest.java b/lisa/lisa-analyses/src/test/java/it/unive/lisa/analysis/string/tarsis/TrimTest.java new file mode 100644 index 000000000..a318a3401 --- /dev/null +++ b/lisa/lisa-analyses/src/test/java/it/unive/lisa/analysis/string/tarsis/TrimTest.java @@ -0,0 +1,31 @@ +package it.unive.lisa.analysis.string.tarsis; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import it.unive.lisa.util.numeric.MathNumberConversionException; + +public class TrimTest { + + @Test + public void repeatSingleString() throws MathNumberConversionException { + RegexAutomaton abc = RegexAutomaton.string("abc"); + RegexAutomaton ws = RegexAutomaton.string(" "); + RegexAutomaton epsilon = RegexAutomaton.string(""); + RegexAutomaton abc_with_ws = RegexAutomaton.string(" a b c "); + + Tarsis a = new Tarsis(abc); + Tarsis b = new Tarsis(ws); + Tarsis c = new Tarsis(abc_with_ws); + + // "abc".trim() = "abc" + assertTrue(a.trim().getAutomaton().isEqualTo(abc)); + + // " ".trim() = "" + assertTrue(b.trim().getAutomaton().isEqualTo(epsilon)); + + // " a b c ".trim() = "a b c" + assertTrue(c.trim().getAutomaton().isEqualTo(RegexAutomaton.string("a b c"))); + } +} diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Atom.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Atom.java index ee5a179cf..7be4e987a 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Atom.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Atom.java @@ -194,4 +194,9 @@ public RegularExpression repeat(long n) { r.simplify(); return r; } + + @Override + public RegularExpression trim() { + return new Atom(this.string.trim()); + } } diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Comp.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Comp.java index 2815e6ca2..41febad48 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Comp.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Comp.java @@ -300,4 +300,14 @@ public RegularExpression repeat(long n) { r = new Comp(r, this); return r.simplify(); } + + @Override + public RegularExpression trim() { + + RegularExpression trimFirst = first.trim().simplify(); + if (trimFirst.isEmpty()) + return second.trim(); + else + return new Comp(trimFirst, second).simplify(); + } } diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/EmptySet.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/EmptySet.java index 68bda350d..99cfc1e76 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/EmptySet.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/EmptySet.java @@ -137,4 +137,9 @@ protected int compareToAux(RegularExpression other) { public RegularExpression repeat(long n) { return this; } + + @Override + public RegularExpression trim() { + return this; + } } diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Or.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Or.java index 4f590aedc..13f93308e 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Or.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Or.java @@ -283,4 +283,9 @@ protected int compareToAux(RegularExpression other) { public RegularExpression repeat(long n) { return new Or(first.repeat(n), second.repeat(n)).simplify(); } + + @Override + public RegularExpression trim() { + return new Or(first.trim(), second.trim()); + } } diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/RegularExpression.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/RegularExpression.java index 7bb255ffb..ef22b4f72 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/RegularExpression.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/RegularExpression.java @@ -313,6 +313,7 @@ public String toString() { public abstract RegularExpression repeat(long n); + public abstract RegularExpression trim(); /** * Yields {@code true} if and only if this regular expression corresponds to * the empty string or to no strings at all. diff --git a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Star.java b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Star.java index ddce789b1..b86f16689 100644 --- a/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Star.java +++ b/lisa/lisa-sdk/src/main/java/it/unive/lisa/util/datastructures/regex/Star.java @@ -240,4 +240,9 @@ protected int compareToAux(RegularExpression other) { public RegularExpression repeat(long n) { return this; } + + @Override + public RegularExpression trim() { + return new Star(op.trim()); + } }