From 401c332ecd583a88d108af289295140b39fbf20d Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 7 Feb 2024 20:09:25 +0100 Subject: [PATCH 1/2] added implementation of negative number matching. --- .../interpreter/matching/NegativePattern.java | 10 +++++++++- src/org/rascalmpl/semantics/dynamic/Expression.java | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/interpreter/matching/NegativePattern.java b/src/org/rascalmpl/interpreter/matching/NegativePattern.java index f5d9c791b05..f47aaaabb22 100644 --- a/src/org/rascalmpl/interpreter/matching/NegativePattern.java +++ b/src/org/rascalmpl/interpreter/matching/NegativePattern.java @@ -20,7 +20,10 @@ import org.rascalmpl.interpreter.IEvaluatorContext; import org.rascalmpl.interpreter.env.Environment; import org.rascalmpl.interpreter.result.Result; +import org.rascalmpl.values.IRascalValueFactory; + import io.usethesource.vallang.IValue; +import io.usethesource.vallang.INumber; import io.usethesource.vallang.type.Type; public class NegativePattern extends AbstractMatchingResult { @@ -53,6 +56,11 @@ public boolean hasNext() { @Override public boolean next() { - return pat.next(); + if(pat.next()) { + if (subject.getDynamicType().isNumber()) { + return ((INumber) subject.getValue()).lessEqual(IRascalValueFactory.getInstance().integer(0)).getValue(); + } + } + return false; } } diff --git a/src/org/rascalmpl/semantics/dynamic/Expression.java b/src/org/rascalmpl/semantics/dynamic/Expression.java index ba5f629189d..8aaae5daeb1 100644 --- a/src/org/rascalmpl/semantics/dynamic/Expression.java +++ b/src/org/rascalmpl/semantics/dynamic/Expression.java @@ -1918,8 +1918,15 @@ public IBooleanResult buildBacktracker(IEvaluatorContext __eval) { } @Override + @SuppressWarnings("unchecked") public IMatchingResult buildMatcher(IEvaluatorContext __eval, boolean bindTypeParameters) { - return new NegativePattern(__eval, this, getArgument().buildMatcher(__eval, bindTypeParameters)); + Type t = getArgument().typeOf(__eval.getCurrentEnvt(), (IEvaluator>) __eval, bindTypeParameters); + + if (getArgument().isTypedVariable() || getArgument().isQualifiedName() || getArgument().isLiteral()) { + return new NegativePattern(__eval, this, getArgument().buildMatcher(__eval, bindTypeParameters)); + } + + throw new UnexpectedType(TF.numberType(), t, getLocation()); } @Override From 7a13680734e8ed87cf805cff823aaab84ef10fda Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 8 Feb 2024 11:31:13 +0100 Subject: [PATCH 2/2] fixed mayMatch --- src/org/rascalmpl/interpreter/matching/NegativePattern.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/interpreter/matching/NegativePattern.java b/src/org/rascalmpl/interpreter/matching/NegativePattern.java index f47aaaabb22..40bf1d5a332 100644 --- a/src/org/rascalmpl/interpreter/matching/NegativePattern.java +++ b/src/org/rascalmpl/interpreter/matching/NegativePattern.java @@ -46,7 +46,7 @@ public void initMatch(Result subject){ @Override public boolean mayMatch(Type subjectType, Environment env){ - return pat.mayMatch(subjectType, env); + return subjectType.isSubtypeOf(tf.numberType()) && pat.mayMatch(subjectType, env); } @Override @@ -56,7 +56,7 @@ public boolean hasNext() { @Override public boolean next() { - if(pat.next()) { + if (pat.next()) { if (subject.getDynamicType().isNumber()) { return ((INumber) subject.getValue()).lessEqual(IRascalValueFactory.getInstance().integer(0)).getValue(); }