Merge branch 'NLPCRAFT-278' of https://github.com/apache/incubator-nlpcraft into NLPCRAFT-278
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
index 8453e94..d917baf 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIdlCompilerBase.scala
@@ -20,7 +20,7 @@
import org.apache.commons.lang3.StringUtils
import org.apache.nlpcraft.common.{NCE, U}
import org.apache.nlpcraft.model.NCToken
-import org.antlr.v4.runtime.{ParserRuleContext ⇒PRC}
+import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
import org.antlr.v4.runtime.tree.{TerminalNode ⇒ TN}
import org.apache.commons.collections.CollectionUtils
import org.apache.nlpcraft.model.intent.{NCIdlContext, NCIdlStack, NCIdlStackType, NCIdlStackItem ⇒ Z}
@@ -29,7 +29,7 @@
import java.time.temporal.IsoFields
import java.time.{LocalDate, LocalTime}
import java.util
-import java.util.{Calendar, Collections, Collection ⇒ JColl, List ⇒ JList, Map ⇒ JMap}
+import java.util.{Calendar, Collections, Comparator, Collection ⇒ JColl, List ⇒ JList, Map ⇒ JMap}
import scala.collection.JavaConverters._
trait NCIdlCompilerBase {
@@ -201,6 +201,34 @@
/**
*
+ * @param x1
+ * @param x2
+ * @return
+ */
+ def extract2(x1: ST, x2: ST): (Object, Object, Int) = {
+ val Z(v1, n1) = x1()
+ val Z(v2, n2) = x2()
+
+ (v1, v2, n1 + n2)
+ }
+
+ /**
+ *
+ * @param x1
+ * @param x2
+ * @param x3
+ * @return
+ */
+ def extract3(x1: ST, x2: ST, x3: ST): (Object, Object, Object, Int) = {
+ val Z(v1, n1) = x1()
+ val Z(v2, n2) = x2()
+ val Z(v3, n3) = x3()
+
+ (v1, v2, v3, n1 + n2 + n3)
+ }
+
+ /**
+ *
* @param lt
* @param gt
* @param lteq
@@ -211,8 +239,7 @@
if (lt != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
val f =
if (isInt(v1) && isInt(v2)) asInt(v1) < asInt(v2)
@@ -222,12 +249,11 @@
else
throw rtBinaryOpError("<", v1, v2)
- Z(f, n1 + n2)
+ Z(f, n)
})
else if (gt != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
val f =
if (isInt(v1) && isInt(v2)) asInt(v1) > asInt(v2)
@@ -237,12 +263,11 @@
else
throw rtBinaryOpError(">", v1, v2)
- Z(f, n1 + n2)
+ Z(f, n)
})
else if (lteq != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
val f =
if (isInt(v1) && isInt(v2)) asInt(v1) <= asInt(v2)
@@ -252,14 +277,13 @@
else
throw rtBinaryOpError("<=", v1, v2)
- Z(f, n1 + n2)
+ Z(f, n)
})
else {
require(gteq != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
val f =
if (isInt(v1) && isInt(v2)) asInt(v1) >= asInt(v2)
@@ -269,7 +293,7 @@
else
throw rtBinaryOpError(">=", v1, v2)
- Z(f, n1 + n2)
+ Z(f, n)
})
}
}
@@ -285,22 +309,20 @@
if (mult != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
- if (isInt(v1) && isInt(v2)) Z(asInt(v1) * asInt(v2), n1 + n2)
- else if (isInt(v1) && isReal(v2)) Z(asInt(v1) * asReal(v2), n1 + n2)
- else if (isReal(v1) && isInt(v2)) Z(asReal(v1) * asInt(v2), n1 + n2)
- else if (isReal(v1) && isReal(v2)) Z(asReal(v1) * asReal(v2), n1 + n2)
+ if (isInt(v1) && isInt(v2)) Z(asInt(v1) * asInt(v2), n)
+ else if (isInt(v1) && isReal(v2)) Z(asInt(v1) * asReal(v2), n)
+ else if (isReal(v1) && isInt(v2)) Z(asReal(v1) * asInt(v2), n)
+ else if (isReal(v1) && isReal(v2)) Z(asReal(v1) * asReal(v2), n)
else
throw rtBinaryOpError("*", v1, v2)
})
else if (mod != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
- if (isInt(v1) && isInt(v2)) Z(asInt(v1) % asInt(v2), n1 + n2)
+ if (isInt(v1) && isInt(v2)) Z(asInt(v1) % asInt(v2), n)
else
throw rtBinaryOpError("%", v1, v2)
})
@@ -308,13 +330,12 @@
assert(div != null)
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
- if (isInt(v1) && isInt(v2)) Z(asInt(v1) / asInt(v2), n1 + n2)
- else if (isInt(v1) && isReal(v2)) Z(asInt(v1) / asReal(v2), n1 + n2)
- else if (isReal(v1) && isInt(v2)) Z(asReal(v1) / asInt(v2), n1 + n2)
- else if (isReal(v1) && isReal(v2)) Z(asReal(v1) / asReal(v2), n1 + n2)
+ if (isInt(v1) && isInt(v2)) Z(asInt(v1) / asInt(v2), n)
+ else if (isInt(v1) && isReal(v2)) Z(asInt(v1) / asReal(v2), n)
+ else if (isReal(v1) && isInt(v2)) Z(asReal(v1) / asInt(v2), n)
+ else if (isReal(v1) && isReal(v2)) Z(asReal(v1) / asReal(v2), n)
else
throw rtBinaryOpError("/", v1, v2)
})
@@ -375,8 +396,7 @@
}
stack.push(() ⇒ {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
+ val (v1, v2, n) = extract2(x1, x2)
val f =
if (eq != null)
@@ -387,7 +407,7 @@
!doEq("!='", v1, v2)
}
- Z(f, n1 + n2)
+ Z(f, n)
})
}
@@ -399,16 +419,9 @@
def parsePlusMinusExpr(plus: TN, minus: TN)(implicit ctx: PRC): SI = (_, stack: S, _) ⇒ {
val (x1, x2) = pop2()(stack, ctx)
- def extract(): (Object, Object, Int) = {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
-
- (v1, v2, n1 + n2)
- }
-
if (plus != null)
stack.push(() ⇒ {
- val (v1, v2, n) = extract()
+ val (v1, v2, n) = extract2(x1, x2)
if (isStr(v1) && isStr(v2)) Z(asStr(v1) + asStr(v2), n)
else if (isInt(v1) && isInt(v2)) Z(asInt(v1) + asInt(v2), n)
@@ -422,7 +435,7 @@
assert(minus != null)
stack.push(() ⇒ {
- val (v1, v2, n) = extract()
+ val (v1, v2, n) = extract2(x1, x2)
if (isInt(v1) && isInt(v2)) Z(asInt(v1) - asInt(v2), n)
else if (isInt(v1) && isReal(v2)) Z(asInt(v1) - asReal(v2), n)
@@ -541,20 +554,6 @@
def toBool(v: Object): Boolean = toX("boolean", v, isBool, asBool)
def toDouble(v: Object): JDouble = toX("double or int", v, x ⇒ isInt(x) || isReal(x), asReal)
- def extract2(x1: ST, x2: ST): (Object, Object, Int) = {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
-
- (v1, v2, n1 + n2)
- }
- def extract3(x1: ST, x2: ST, x3: ST): (Object, Object, Object, Int) = {
- val Z(v1, n1) = x1()
- val Z(v2, n2) = x2()
- val Z(v3, n3) = x3()
-
- (v1, v2, v3, n1 + n2 + n3)
- }
-
def doSplit(): Unit = {
val (x1, x2) = arg2()