This is an automated email from the ASF dual-hosted git repository.
aradzinski pushed a commit to branch NLPCRAFT-206
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git
The following commit(s) were added to refs/heads/NLPCRAFT-206 by this push:
new 9f7d973 WIP.
9f7d973 is described below
commit 9f7d973af311d775360f6c57393af959941f88cb
Author: Aaron Radzinski <[email protected]>
AuthorDate: Tue Feb 16 18:55:16 2021 -0800
WIP.
---
.../model/intent/impl/ver2/NCBaseDslCompiler.scala | 285 +++++++++++++++++++++
.../intent/impl/ver2/NCIntentDslCompiler.scala | 248 +-----------------
2 files changed, 294 insertions(+), 239 deletions(-)
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCBaseDslCompiler.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCBaseDslCompiler.scala
new file mode 100644
index 0000000..bb02a22
--- /dev/null
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCBaseDslCompiler.scala
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.nlpcraft.model.intent.impl.ver2
+
+import org.antlr.v4.runtime.tree.{TerminalNode ⇒ TN}
+import org.apache.nlpcraft.model.NCToken
+import org.apache.nlpcraft.model.intent.utils.ver2.{NCDslTermContext,
NCDslTermRetVal}
+
+import java.lang.{Double ⇒ JDouble, IllegalArgumentException ⇒ IAE, Long ⇒
JLong}
+import scala.collection.mutable
+
+trait NCBaseDslCompiler {
+ type StackType = mutable.ArrayStack[NCDslTermRetVal]
+ type Instr = (NCToken, StackType, NCDslTermContext) ⇒ Unit
+
+ def isJLong(v: AnyRef): Boolean = v.isInstanceOf[JLong]
+ def isJDouble(v: AnyRef): Boolean = v.isInstanceOf[JDouble]
+ def isString(v: AnyRef): Boolean = v.isInstanceOf[String]
+ def isBoolean(v: AnyRef): Boolean = v.isInstanceOf[Boolean]
+ def asJLong(v: AnyRef): Long = v.asInstanceOf[JLong].longValue()
+ def asJDouble(v: AnyRef): Double = v.asInstanceOf[JDouble].doubleValue()
+ def asString(v: AnyRef): String = v.asInstanceOf[String]
+ def asBoolean(v: AnyRef): Boolean = v.asInstanceOf[Boolean]
+
+ def pushAny(any: AnyRef, usedTok: Boolean)(implicit stack: StackType):
Unit =
+ stack.push(NCDslTermRetVal(any, usedTok))
+ def pushLong(any: Long, usedTok: Boolean)(implicit stack: StackType): Unit
=
+ stack.push(NCDslTermRetVal(Long.box(any), usedTok))
+ def pushDouble(any: Double, usedTok: Boolean)(implicit stack: StackType):
Unit =
+ stack.push(NCDslTermRetVal(Double.box(any), usedTok))
+ def pushBoolean(any: Boolean, usedTok: Boolean)(implicit stack:
StackType): Unit =
+ stack.push(NCDslTermRetVal(Boolean.box(any), usedTok))
+
+ def errUnaryOp(op: String, v: AnyRef): IAE =
+ new IAE(s"Unexpected '$op' DSL operation for value: $v")
+ def errBinaryOp(op: String, v1: AnyRef, v2: AnyRef): IAE =
+ new IAE(s"Unexpected '$op' DSL operation for values: $v1, $v2")
+ def errUnknownFun(fun: String): IAE =
+ new IAE(s"Unknown DSL function: $fun()")
+ def errMinParamNum(min: Int, fun: String): IAE =
+ new IAE(s"Invalid number of parameters for DSL function ($min is
required): $fun()")
+ def errParamNum(fun: String): IAE =
+ new IAE(s"Invalid number of parameters for DSL function: $fun()")
+ def errParamType(fun: String, param: AnyRef, expectType: String): IAE =
+ new IAE(s"Expecting '$expectType' type of parameter for DSL function
'$fun()', found: $param")
+
+ /**
+ *
+ * @param stack
+ * @return
+ */
+ def pop2()(implicit stack: StackType): (AnyRef, AnyRef, Boolean, Boolean)
= {
+ require(stack.size >= 2)
+
+ // Stack pops in reverse order of push...
+ val NCDslTermRetVal(val2, f2) = stack.pop()
+ val NCDslTermRetVal(val1, f1) = stack.pop()
+
+ (val1, val2, f1, f2)
+ }
+ /**
+ *
+ * @param stack
+ * @return
+ */
+ def pop3()(implicit stack: StackType): (AnyRef, AnyRef, AnyRef, Boolean,
Boolean, Boolean) = {
+ require(stack.size >= 3)
+
+ // Stack pops in reverse order of push...
+ val NCDslTermRetVal(val3, f3) = stack.pop()
+ val NCDslTermRetVal(val2, f2) = stack.pop()
+ val NCDslTermRetVal(val1, f1) = stack.pop()
+
+ (val1, val2, val3, f1, f2, f3)
+ }
+
+ /**
+ *
+ * @param stack
+ * @return
+ */
+ def pop1()(implicit stack: StackType): (AnyRef, Boolean) = {
+ require(stack.nonEmpty)
+
+ val NCDslTermRetVal(v, f) = stack.pop()
+
+ (v, f)
+ }
+
+ /**
+ *
+ * @param lt
+ * @param gt
+ * @param lteq
+ * @param gteq
+ */
+ def parseCompExpr(lt: TN, gt: TN, lteq: TN, gteq: TN): Instr = (_, stack:
StackType, _) ⇒ {
+ implicit val s = stack
+
+ val (v1, v2, f1, f2) = pop2()
+ val usedTok = f1 || f2
+
+ if (lt != null) {
+ if (isJLong(v1) && isJLong(v2))
+ pushBoolean(asJLong(v1) < asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushBoolean(asJLong(v1) < asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushBoolean(asJDouble(v1) < asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushBoolean(asJDouble(v1) < asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("<", v1, v2)
+ }
+ else if (gt != null) {
+ if (isJLong(v1) && isJLong(v2))
+ pushBoolean(asJLong(v1) > asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushBoolean(asJLong(v1) > asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushBoolean(asJDouble(v1) > asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushBoolean(asJDouble(v1) > asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp(">", v1, v2)
+ }
+ else if (lteq != null) {
+ if (isJLong(v1) && isJLong(v2))
+ pushBoolean(asJLong(v1) <= asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushBoolean(asJLong(v1) <= asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushBoolean(asJDouble(v1) <= asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushBoolean(asJDouble(v1) <= asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("<=", v1, v2)
+ }
+ else {
+ assert(gteq != null)
+
+ if (isJLong(v1) && isJLong(v2))
+ pushBoolean(asJLong(v1) >= asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushBoolean(asJLong(v1) >= asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushBoolean(asJDouble(v1) >= asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushBoolean(asJDouble(v1) >= asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp(">=", v1, v2)
+ }
+ }
+
+ /**
+ *
+ * @param mult
+ * @param mod
+ * @param div
+ */
+ def parseMultExpr(mult: TN, mod: TN, div: TN): Instr = (_, stack:
StackType, _) ⇒ {
+ implicit val s = stack
+
+ val (v1, v2, f1, f2) = pop2()
+ val usedTok = f1 || f2
+
+ if (mult != null) {
+ if (isJLong(v1) && isJLong(v2))
+ pushLong(asJLong(v1) * asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushDouble(asJLong(v1) * asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushDouble(asJDouble(v1) * asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushDouble(asJDouble(v1) * asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("*", v1, v2)
+ }
+ else if (mod != null) {
+ if (isJLong(v1) && isJLong(v2))
+ pushLong(asJLong(v1) % asJLong(v2), usedTok)
+ else
+ throw errBinaryOp("%", v1, v2)
+ }
+ else {
+ assert(div != null)
+
+ if (isJLong(v1) && isJLong(v2))
+ pushLong(asJLong(v1) / asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushDouble(asJLong(v1) / asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushDouble(asJDouble(v1) / asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushDouble(asJDouble(v1) / asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("/", v1, v2)
+ }
+ }
+
+ /**
+ *
+ * @param plus
+ * @param minus
+ */
+ def parsePlusExpr(plus: TN, minus: TN): Instr = (_, stack: StackType, _) ⇒
{
+ implicit val s = stack
+
+ val (v1, v2, f1, f2) = pop2()
+ val usedTok = f1 || f2
+
+ if (plus != null) {
+ if (isString(v1) && isString(v2))
+ pushAny(asString(v1) + asString(v2), usedTok)
+ else if (isJLong(v1) && isJLong(v2))
+ pushLong(asJLong(v1) + asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushDouble(asJLong(v1) + asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushDouble(asJDouble(v1) + asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushDouble(asJDouble(v1) + asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("+", v1, v2)
+ }
+ else {
+ assert(minus != null)
+
+ if (isJLong(v1) && isJLong(v2))
+ pushLong(asJLong(v1) - asJLong(v2), usedTok)
+ else if (isJLong(v1) && isJDouble(v2))
+ pushDouble(asJLong(v1) - asJDouble(v2), usedTok)
+ else if (isJDouble(v1) && isJLong(v2))
+ pushDouble(asJDouble(v1) - asJLong(v2), usedTok)
+ else if (isJDouble(v1) && isJDouble(v2))
+ pushDouble(asJDouble(v1) - asJDouble(v2), usedTok)
+ else
+ throw errBinaryOp("-", v1, v2)
+ }
+ }
+
+
+ /**
+ * @param minus
+ * @param not
+ * @return
+ */
+ def parseUnaryExpr(minus: TN, not: TN): Instr = (_, stack: StackType, _) ⇒
{
+ implicit val s = stack
+
+ val (v, usedTok) = pop1()
+
+ if (minus != null) {
+ if (isJDouble(v))
+ pushDouble(-asJDouble(v), usedTok)
+ else if (isJLong(v))
+ pushLong(-asJLong(v), usedTok)
+ else
+ throw errUnaryOp("-", v)
+ }
+ else {
+ assert(not != null)
+
+ if (isBoolean(v))
+ pushBoolean(!asBoolean(v), usedTok)
+ else
+ throw errUnaryOp("!", v)
+ }
+ }
+}
diff --git
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
index 11c94d3..e711b3c 100644
---
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
+++
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/ver2/NCIntentDslCompiler.scala
@@ -44,7 +44,7 @@ object NCIntentDslCompiler extends LazyLogging {
*
*/
//noinspection DuplicatedCode
- class FiniteStateMachine(dsl: String) extends NCIntentDslBaseListener {
+ class FiniteStateMachine(dsl: String) extends NCIntentDslBaseListener with
NCBaseDslCompiler {
// Intent components.
private var id: String = _
private var ordered: Boolean = false
@@ -60,43 +60,9 @@ object NCIntentDslCompiler extends LazyLogging {
private var termClsName: String = _
private var termMtdName: String = _
- type StackType = mutable.ArrayStack[NCDslTermRetVal]
- type Instr = (NCToken, StackType, NCDslTermContext) ⇒ Unit
-
// Term's code, i.e. list of instructions.
private var termInstrs = mutable.Buffer.empty[Instr]
- private def isJLong(v: AnyRef): Boolean = v.isInstanceOf[JLong]
- private def isJDouble(v: AnyRef): Boolean = v.isInstanceOf[JDouble]
- private def isString(v: AnyRef): Boolean = v.isInstanceOf[String]
- private def isBoolean(v: AnyRef): Boolean = v.isInstanceOf[Boolean]
- private def asJLong(v: AnyRef): Long =
v.asInstanceOf[JLong].longValue()
- private def asJDouble(v: AnyRef): Double =
v.asInstanceOf[JDouble].doubleValue()
- private def asString(v: AnyRef): String = v.asInstanceOf[String]
- private def asBoolean(v: AnyRef): Boolean = v.asInstanceOf[Boolean]
-
- private def pushAny(any: AnyRef, usedTok: Boolean)(implicit stack:
StackType): Unit =
- stack.push(NCDslTermRetVal(any, usedTok))
- private def pushLong(any: Long, usedTok: Boolean)(implicit stack:
StackType): Unit =
- stack.push(NCDslTermRetVal(Long.box(any), usedTok))
- private def pushDouble(any: Double, usedTok: Boolean)(implicit stack:
StackType): Unit =
- stack.push(NCDslTermRetVal(Double.box(any), usedTok))
- private def pushBoolean(any: Boolean, usedTok: Boolean)(implicit
stack: StackType): Unit =
- stack.push(NCDslTermRetVal(Boolean.box(any), usedTok))
-
- private def errUnaryOp(op: String, v: AnyRef): IAE =
- new IAE(s"Unexpected '$op' DSL operation for value: $v")
- private def errBinaryOp(op: String, v1: AnyRef, v2: AnyRef): IAE =
- new IAE(s"Unexpected '$op' DSL operation for values: $v1, $v2")
- private def errUnknownFun(fun: String): IAE =
- new IAE(s"Unknown DSL function: $fun()")
- private def errMinParamNum(min: Int, fun: String): IAE =
- new IAE(s"Invalid number of parameters for DSL function ($min is
required): $fun()")
- private def errParamNum(fun: String): IAE =
- new IAE(s"Invalid number of parameters for DSL function: $fun()")
- private def errParamType(fun: String, param: AnyRef, expectType:
String): IAE =
- new IAE(s"Expecting '$expectType' type of parameter for DSL
function '$fun()', found: $param")
-
/**
*
* @param min
@@ -118,213 +84,17 @@ object NCIntentDslCompiler extends LazyLogging {
assert(false)
}
- /**
- *
- * @param stack
- * @return
- */
- private def pop2()(implicit stack: StackType): (AnyRef, AnyRef,
Boolean, Boolean) = {
- require(stack.size >= 2)
-
- // Stack pops in reverse order of push...
- val NCDslTermRetVal(val2, f2) = stack.pop()
- val NCDslTermRetVal(val1, f1) = stack.pop()
-
- (val1, val2, f1, f2)
- }
- /**
- *
- * @param stack
- * @return
- */
- private def pop3()(implicit stack: StackType): (AnyRef, AnyRef,
AnyRef, Boolean, Boolean, Boolean) = {
- require(stack.size >= 3)
-
- // Stack pops in reverse order of push...
- val NCDslTermRetVal(val3, f3) = stack.pop()
- val NCDslTermRetVal(val2, f2) = stack.pop()
- val NCDslTermRetVal(val1, f1) = stack.pop()
-
- (val1, val2, val3, f1, f2, f3)
- }
-
- /**
- *
- * @param stack
- * @return
- */
- private def pop1()(implicit stack: StackType): (AnyRef, Boolean) = {
- val NCDslTermRetVal(v, f) = stack.pop()
+ override def exitUnaryExpr(ctx: NCIntentDslParser.UnaryExprContext):
Unit =
+ termInstrs += parseUnaryExpr(ctx.MINUS(), ctx.NOT())
- (v, f)
- }
+ override def exitMultExpr(ctx: NCIntentDslParser.MultExprContext):
Unit =
+ termInstrs += parseMultExpr(ctx.MULT(), ctx.MOD(), ctx.DIV())
- override def exitUnaryExpr(ctx: NCIntentDslParser.UnaryExprContext):
Unit = {
- termInstrs += ((_, stack: StackType, _) ⇒ {
- require(stack.nonEmpty)
+ override def exitPlusExpr(ctx: NCIntentDslParser.PlusExprContext):
Unit =
+ termInstrs += parsePlusExpr(ctx.PLUS(), ctx.MINUS())
- implicit val s = stack
-
- val (v, usedTok) = pop1()
-
- if (ctx.MINUS() != null) {
- if (isJDouble(v))
- pushDouble(-asJDouble(v), usedTok)
- else if (isJLong(v))
- pushLong(-asJLong(v), usedTok)
- else
- throw errUnaryOp("-", v)
- }
- else {
- assert(ctx.NOT() != null)
-
- if (isBoolean(v))
- pushBoolean(!asBoolean(v), usedTok)
- else
- throw errUnaryOp("!", v)
- }
- })
- }
-
- override def exitMultExpr(ctx: NCIntentDslParser.MultExprContext):
Unit = {
- termInstrs += ((_, stack: StackType, _) ⇒ {
- implicit val s = stack
-
- val (v1, v2, f1, f2) = pop2()
- val usedTok = f1 || f2
-
- if (ctx.MULT() != null) {
- if (isJLong(v1) && isJLong(v2))
- pushLong(asJLong(v1) * asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushDouble(asJLong(v1) * asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushDouble(asJDouble(v1) * asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushDouble(asJDouble(v1) * asJDouble(v2), usedTok)
- else
- throw errBinaryOp("*", v1, v2)
- }
- else if (ctx.MOD() != null) {
- if (isJLong(v1) && isJLong(v2))
- pushLong(asJLong(v1) % asJLong(v2), usedTok)
- else
- throw errBinaryOp("%", v1, v2)
- }
- else {
- assert(ctx.DIV() != null)
-
- if (isJLong(v1) && isJLong(v2))
- pushLong(asJLong(v1) / asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushDouble(asJLong(v1) / asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushDouble(asJDouble(v1) / asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushDouble(asJDouble(v1) / asJDouble(v2), usedTok)
- else
- throw errBinaryOp("/", v1, v2)
- }
- })
- }
-
- override def exitPlusExpr(ctx: NCIntentDslParser.PlusExprContext):
Unit = {
- termInstrs += ((_, stack: StackType, _) ⇒ {
- implicit val s = stack
-
- val (v1, v2, f1, f2) = pop2()
- val usedTok = f1 || f2
-
- if (ctx.PLUS != null) {
- if (isString(v1) && isString(v2))
- pushAny(asString(v1) + asString(v2), usedTok)
- else if (isJLong(v1) && isJLong(v2))
- pushLong(asJLong(v1) + asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushDouble(asJLong(v1) + asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushDouble(asJDouble(v1) + asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushDouble(asJDouble(v1) + asJDouble(v2), usedTok)
- else
- throw errBinaryOp("+", v1, v2)
- }
- else {
- assert(ctx.MINUS != null)
-
- if (isJLong(v1) && isJLong(v2))
- pushLong(asJLong(v1) - asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushDouble(asJLong(v1) - asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushDouble(asJDouble(v1) - asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushDouble(asJDouble(v1) - asJDouble(v2), usedTok)
- else
- throw errBinaryOp("-", v1, v2)
- }
- })
- }
-
- override def exitCompExpr(ctx: NCIntentDslParser.CompExprContext):
Unit = {
- termInstrs += ((_, stack: StackType, _) ⇒ {
- implicit val s = stack
-
- val (v1, v2, f1, f2) = pop2()
- val usedTok = f1 || f2
-
- if (ctx.LT() != null) {
- if (isJLong(v1) && isJLong(v2))
- pushBoolean(asJLong(v1) < asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushBoolean(asJLong(v1) < asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushBoolean(asJDouble(v1) < asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushBoolean(asJDouble(v1) < asJDouble(v2), usedTok)
- else
- throw errBinaryOp("<", v1, v2)
- }
- else if (ctx.GT() != null) {
- if (isJLong(v1) && isJLong(v2))
- pushBoolean(asJLong(v1) > asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushBoolean(asJLong(v1) > asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushBoolean(asJDouble(v1) > asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushBoolean(asJDouble(v1) > asJDouble(v2), usedTok)
- else
- throw errBinaryOp(">", v1, v2)
- }
- else if (ctx.LTEQ() != null) {
- if (isJLong(v1) && isJLong(v2))
- pushBoolean(asJLong(v1) <= asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushBoolean(asJLong(v1) <= asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushBoolean(asJDouble(v1) <= asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushBoolean(asJDouble(v1) <= asJDouble(v2), usedTok)
- else
- throw errBinaryOp("<=", v1, v2)
- }
- else {
- assert(ctx.GTEQ() != null)
-
- if (isJLong(v1) && isJLong(v2))
- pushBoolean(asJLong(v1) >= asJLong(v2), usedTok)
- else if (isJLong(v1) && isJDouble(v2))
- pushBoolean(asJLong(v1) >= asJDouble(v2), usedTok)
- else if (isJDouble(v1) && isJLong(v2))
- pushBoolean(asJDouble(v1) >= asJLong(v2), usedTok)
- else if (isJDouble(v1) && isJDouble(v2))
- pushBoolean(asJDouble(v1) >= asJDouble(v2), usedTok)
- else
- throw errBinaryOp(">=", v1, v2)
- }
- })
- }
+ override def exitCompExpr(ctx: NCIntentDslParser.CompExprContext):
Unit =
+ termInstrs += parseCompExpr(ctx.LT(), ctx.GT(), ctx.LTEQ(),
ctx.GTEQ())
override def exitLogExpr(ctx: NCIntentDslParser.LogExprContext): Unit
= {
termInstrs += ((_, stack: StackType, _) ⇒ {