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 f7bd364  WIP.
f7bd364 is described below

commit f7bd3647f5d4f47cd1b135df00e1259aaa1c5664
Author: Aaron Radzinski <[email protected]>
AuthorDate: Fri Feb 12 19:49:23 2021 -0800

    WIP.
---
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   4 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   2 +-
 .../impl/antlr4/NCIntentDslBaseListener.java       |   2 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java |   2 +-
 .../intent/impl/antlr4/NCIntentDslListener.java    |   2 +-
 .../intent/impl/antlr4/NCIntentDslParser.java      | 270 ++++++++++---------
 .../intent/impl/ver2/NCIntentDslCompiler.scala     | 285 ++++++++++++++++-----
 .../model/intent/utils/ver2/NCDslTermRetVal.scala  |   2 +-
 8 files changed, 368 insertions(+), 201 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
index 57a595f..938b565 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
@@ -57,7 +57,9 @@ termDef
     | termDef (AND | OR) termDef
     | EXCL termDef
     ;
-termPred: expr PRED_OP expr;
+termPred
+    : expr PRED_OP expr
+    | expr;
 expr
     : val
     | expr COMMA val
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
index 2c559f9..00bd601 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
@@ -120,4 +120,4 @@ minMaxRange
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 46, 260, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 
4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 
14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 
20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 
25, 3, 2, 3, 2, 5, 2, 53, 10, 2, 3, 2, 5, 2, 56, 10, 2, 3, 2, 5, 2, 59, 10, 2, 
3, 2, 3, 2, 3, 2, 3, 3, 3 [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 46, 263, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 
4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 
14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 
20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 
25, 3, 2, 3, 2, 5, 2, 53, 10, 2, 3, 2, 5, 2, 56, 10, 2, 3, 2, 5, 2, 59, 10, 2, 
3, 2, 3, 2, 3, 2, 3, 3, 3 [...]
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
index c083c73..ed640ba 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
@@ -1,4 +1,4 @@
-// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.9.1
+// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
index a42630c..24d3f45 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
@@ -1,4 +1,4 @@
-// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.9.1
+// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
index 6cce4e1..e18b490 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
@@ -1,4 +1,4 @@
-// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.9.1
+// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
index 355e75b..2a1fce0 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
@@ -1,4 +1,4 @@
-// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.9.1
+// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
@@ -1264,14 +1264,27 @@ public class NCIntentDslParser extends Parser {
                TermPredContext _localctx = new TermPredContext(_ctx, 
getState());
                enterRule(_localctx, 32, RULE_termPred);
                try {
-                       enterOuterAlt(_localctx, 1);
-                       {
-                       setState(197);
-                       expr(0);
-                       setState(198);
-                       match(PRED_OP);
-                       setState(199);
-                       expr(0);
+                       setState(202);
+                       _errHandler.sync(this);
+                       switch ( 
getInterpreter().adaptivePredict(_input,19,_ctx) ) {
+                       case 1:
+                               enterOuterAlt(_localctx, 1);
+                               {
+                               setState(197);
+                               expr(0);
+                               setState(198);
+                               match(PRED_OP);
+                               setState(199);
+                               expr(0);
+                               }
+                               break;
+                       case 2:
+                               enterOuterAlt(_localctx, 2);
+                               {
+                               setState(201);
+                               expr(0);
+                               }
+                               break;
                        }
                }
                catch (RecognitionException re) {
@@ -1336,7 +1349,7 @@ public class NCIntentDslParser extends Parser {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(208);
+                       setState(211);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case SQSTRING:
@@ -1346,23 +1359,23 @@ public class NCIntentDslParser extends Parser {
                        case NULL:
                        case INT:
                                {
-                               setState(202);
+                               setState(205);
                                val();
                                }
                                break;
                        case LPAREN:
                                {
-                               setState(203);
+                               setState(206);
                                match(LPAREN);
-                               setState(204);
+                               setState(207);
                                expr(0);
-                               setState(205);
+                               setState(208);
                                match(RPAREN);
                                }
                                break;
                        case ID:
                                {
-                               setState(207);
+                               setState(210);
                                funCall();
                                }
                                break;
@@ -1370,24 +1383,24 @@ public class NCIntentDslParser extends Parser {
                                throw new NoViableAltException(this);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(218);
+                       setState(221);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,21,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,22,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
                                        _prevctx = _localctx;
                                        {
-                                       setState(216);
+                                       setState(219);
                                        _errHandler.sync(this);
-                                       switch ( 
getInterpreter().adaptivePredict(_input,20,_ctx) ) {
+                                       switch ( 
getInterpreter().adaptivePredict(_input,21,_ctx) ) {
                                        case 1:
                                                {
                                                _localctx = new 
ExprContext(_parentctx, _parentState);
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(210);
+                                               setState(213);
                                                if (!(precpred(_ctx, 2))) throw 
new FailedPredicateException(this, "precpred(_ctx, 2)");
-                                               setState(211);
+                                               setState(214);
                                                _la = _input.LA(1);
                                                if ( !((((_la) & ~0x3f) == 0 && 
((1L << _la) & ((1L << MINUS) | (1L << PLUS) | (1L << STAR) | (1L << FSLASH) | 
(1L << PERCENT))) != 0)) ) {
                                                _errHandler.recoverInline(this);
@@ -1397,7 +1410,7 @@ public class NCIntentDslParser extends Parser {
                                                        
_errHandler.reportMatch(this);
                                                        consume();
                                                }
-                                               setState(212);
+                                               setState(215);
                                                expr(3);
                                                }
                                                break;
@@ -1405,20 +1418,20 @@ public class NCIntentDslParser extends Parser {
                                                {
                                                _localctx = new 
ExprContext(_parentctx, _parentState);
                                                
pushNewRecursionContext(_localctx, _startState, RULE_expr);
-                                               setState(213);
+                                               setState(216);
                                                if (!(precpred(_ctx, 4))) throw 
new FailedPredicateException(this, "precpred(_ctx, 4)");
-                                               setState(214);
+                                               setState(217);
                                                match(COMMA);
-                                               setState(215);
+                                               setState(218);
                                                val();
                                                }
                                                break;
                                        }
                                        } 
                                }
-                               setState(220);
+                               setState(223);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,21,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,22,_ctx);
                        }
                        }
                }
@@ -1461,21 +1474,21 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(221);
+                       setState(224);
                        match(ID);
-                       setState(222);
+                       setState(225);
                        match(LPAREN);
-                       setState(224);
+                       setState(227);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
SQSTRING) | (1L << DQSTRING) | (1L << LPAREN) | (1L << MINUS) | (1L << BOOL) | 
(1L << NULL) | (1L << INT) | (1L << ID))) != 0)) {
                                {
-                               setState(223);
+                               setState(226);
                                expr(0);
                                }
                        }
 
-                       setState(226);
+                       setState(229);
                        match(RPAREN);
                        }
                }
@@ -1519,13 +1532,13 @@ public class NCIntentDslParser extends Parser {
                enterRule(_localctx, 38, RULE_val);
                int _la;
                try {
-                       setState(241);
+                       setState(244);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case NULL:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(228);
+                               setState(231);
                                match(NULL);
                                }
                                break;
@@ -1533,34 +1546,34 @@ public class NCIntentDslParser extends Parser {
                        case INT:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(230);
+                               setState(233);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if (_la==MINUS) {
                                        {
-                                       setState(229);
+                                       setState(232);
                                        match(MINUS);
                                        }
                                }
 
-                               setState(232);
+                               setState(235);
                                match(INT);
-                               setState(234);
+                               setState(237);
                                _errHandler.sync(this);
-                               switch ( 
getInterpreter().adaptivePredict(_input,24,_ctx) ) {
+                               switch ( 
getInterpreter().adaptivePredict(_input,25,_ctx) ) {
                                case 1:
                                        {
-                                       setState(233);
+                                       setState(236);
                                        match(REAL);
                                        }
                                        break;
                                }
-                               setState(237);
+                               setState(240);
                                _errHandler.sync(this);
-                               switch ( 
getInterpreter().adaptivePredict(_input,25,_ctx) ) {
+                               switch ( 
getInterpreter().adaptivePredict(_input,26,_ctx) ) {
                                case 1:
                                        {
-                                       setState(236);
+                                       setState(239);
                                        match(EXP);
                                        }
                                        break;
@@ -1570,7 +1583,7 @@ public class NCIntentDslParser extends Parser {
                        case BOOL:
                                enterOuterAlt(_localctx, 3);
                                {
-                               setState(239);
+                               setState(242);
                                match(BOOL);
                                }
                                break;
@@ -1578,7 +1591,7 @@ public class NCIntentDslParser extends Parser {
                        case DQSTRING:
                                enterOuterAlt(_localctx, 4);
                                {
-                               setState(240);
+                               setState(243);
                                qstring();
                                }
                                break;
@@ -1621,7 +1634,7 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(243);
+                       setState(246);
                        _la = _input.LA(1);
                        if ( !(_la==SQSTRING || _la==DQSTRING) ) {
                        _errHandler.recoverInline(this);
@@ -1669,7 +1682,7 @@ public class NCIntentDslParser extends Parser {
                MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
                enterRule(_localctx, 42, RULE_minMax);
                try {
-                       setState(247);
+                       setState(250);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case PLUS:
@@ -1677,14 +1690,14 @@ public class NCIntentDslParser extends Parser {
                        case STAR:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(245);
+                               setState(248);
                                minMaxShortcut();
                                }
                                break;
                        case LBR:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(246);
+                               setState(249);
                                minMaxRange();
                                }
                                break;
@@ -1728,7 +1741,7 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(249);
+                       setState(252);
                        _la = _input.LA(1);
                        if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
PLUS) | (1L << QUESTION) | (1L << STAR))) != 0)) ) {
                        _errHandler.recoverInline(this);
@@ -1779,15 +1792,15 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(251);
+                       setState(254);
                        match(LBR);
-                       setState(252);
+                       setState(255);
                        match(INT);
-                       setState(253);
+                       setState(256);
                        match(COMMA);
-                       setState(254);
+                       setState(257);
                        match(INT);
-                       setState(255);
+                       setState(258);
                        match(RBR);
                        }
                }
@@ -1847,7 +1860,7 @@ public class NCIntentDslParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3.\u0104\4\2\t\2\4"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3.\u0107\4\2\t\2\4"+
                
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
                
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
                
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -1861,78 +1874,79 @@ public class NCIntentDslParser extends Parser {
                
"\3\r\5\r\u009f\n\r\3\16\5\16\u00a2\n\16\3\16\3\16\3\16\3\17\3\17\3\17"+
                
"\3\17\3\17\3\17\7\17\u00ad\n\17\f\17\16\17\u00b0\13\17\3\20\3\20\3\20"+
                
"\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u00be\n\21\3\21\3\21"+
-               
"\3\21\7\21\u00c3\n\21\f\21\16\21\u00c6\13\21\3\22\3\22\3\22\3\22\3\23"+
-               
"\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u00d3\n\23\3\23\3\23\3\23\3\23\3\23"+
-               
"\3\23\7\23\u00db\n\23\f\23\16\23\u00de\13\23\3\24\3\24\3\24\5\24\u00e3"+
-               
"\n\24\3\24\3\24\3\25\3\25\5\25\u00e9\n\25\3\25\3\25\5\25\u00ed\n\25\3"+
-               
"\25\5\25\u00f0\n\25\3\25\3\25\5\25\u00f4\n\25\3\26\3\26\3\27\3\27\5\27"+
-               
"\u00fa\n\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\2\6\24\34 $\32"+
-               "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 
\"$&(*,.\60\2\7\4\2\25\25\37\37"+
-               "\3\2\13\f\5\2\34\34  \"$\3\2\b\t\3\2 
\"\2\u010f\2\62\3\2\2\2\4?\3\2\2"+
-               
"\2\6C\3\2\2\2\bG\3\2\2\2\nK\3\2\2\2\f\\\3\2\2\2\16^\3\2\2\2\20q\3\2\2"+
-               
"\2\22\u0080\3\2\2\2\24\u0082\3\2\2\2\26\u008c\3\2\2\2\30\u008e\3\2\2\2"+
-               "\32\u00a1\3\2\2\2\34\u00a6\3\2\2\2\36\u00b1\3\2\2\2 
\u00bd\3\2\2\2\"\u00c7"+
-               
"\3\2\2\2$\u00d2\3\2\2\2&\u00df\3\2\2\2(\u00f3\3\2\2\2*\u00f5\3\2\2\2,"+
-               
"\u00f9\3\2\2\2.\u00fb\3\2\2\2\60\u00fd\3\2\2\2\62\64\5\4\3\2\63\65\5\6"+
-               
"\4\2\64\63\3\2\2\2\64\65\3\2\2\2\65\67\3\2\2\2\668\5\b\5\2\67\66\3\2\2"+
-               
"\2\678\3\2\2\28:\3\2\2\29;\5\n\6\2:9\3\2\2\2:;\3\2\2\2;<\3\2\2\2<=\5\24"+
-               
"\13\2=>\7\2\2\3>\3\3\2\2\2?@\7\3\2\2@A\7\37\2\2AB\7,\2\2B\5\3\2\2\2CD"+
-               
"\7\4\2\2DE\7\37\2\2EF\7\'\2\2F\7\3\2\2\2GH\7\5\2\2HI\7\37\2\2IJ\5*\26"+
-               
"\2J\t\3\2\2\2KL\7\6\2\2LM\7\37\2\2MN\5\f\7\2N\13\3\2\2\2OP\7\21\2\2PU"+
-               
"\5\16\b\2QR\7\32\2\2RT\5\16\b\2SQ\3\2\2\2TW\3\2\2\2US\3\2\2\2UV\3\2\2"+
-               
"\2VX\3\2\2\2WU\3\2\2\2XY\7\22\2\2Y]\3\2\2\2Z[\7\21\2\2[]\7\22\2\2\\O\3"+
-               
"\2\2\2\\Z\3\2\2\2]\r\3\2\2\2^_\5*\26\2_`\7\33\2\2`a\5\20\t\2a\17\3\2\2"+
-               
"\2br\5*\26\2ce\7\34\2\2dc\3\2\2\2de\3\2\2\2ef\3\2\2\2fh\7)\2\2gi\7*\2"+
-               
"\2hg\3\2\2\2hi\3\2\2\2ik\3\2\2\2jl\7+\2\2kj\3\2\2\2kl\3\2\2\2lr\3\2\2"+
-               
"\2mr\5\f\7\2nr\5\22\n\2or\7\'\2\2pr\7(\2\2qb\3\2\2\2qd\3\2\2\2qm\3\2\2"+
-               
"\2qn\3\2\2\2qo\3\2\2\2qp\3\2\2\2r\21\3\2\2\2st\7\27\2\2ty\5\20\t\2uv\7"+
-               
"\32\2\2vx\5\20\t\2wu\3\2\2\2x{\3\2\2\2yw\3\2\2\2yz\3\2\2\2z|\3\2\2\2{"+
-               
"y\3\2\2\2|}\7\30\2\2}\u0081\3\2\2\2~\177\7\27\2\2\177\u0081\7\30\2\2\u0080"+
-               
"s\3\2\2\2\u0080~\3\2\2\2\u0081\23\3\2\2\2\u0082\u0083\b\13\1\2\u0083\u0084"+
-               
"\5\30\r\2\u0084\u0089\3\2\2\2\u0085\u0086\f\3\2\2\u0086\u0088\5\30\r\2"+
-               
"\u0087\u0085\3\2\2\2\u0088\u008b\3\2\2\2\u0089\u0087\3\2\2\2\u0089\u008a"+
-               
"\3\2\2\2\u008a\25\3\2\2\2\u008b\u0089\3\2\2\2\u008c\u008d\t\2\2\2\u008d"+
-               
"\27\3\2\2\2\u008e\u0090\7\7\2\2\u008f\u0091\5\36\20\2\u0090\u008f\3\2"+
-               
"\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u009b\5\26\f\2\u0093"+
-               "\u0094\7\21\2\2\u0094\u0095\5 
\21\2\u0095\u0096\7\22\2\2\u0096\u009c\3"+
-               
"\2\2\2\u0097\u0098\7#\2\2\u0098\u0099\5\32\16\2\u0099\u009a\7#\2\2\u009a"+
-               
"\u009c\3\2\2\2\u009b\u0093\3\2\2\2\u009b\u0097\3\2\2\2\u009c\u009e\3\2"+
-               
"\2\2\u009d\u009f\5,\27\2\u009e\u009d\3\2\2\2\u009e\u009f\3\2\2\2\u009f"+
-               
"\31\3\2\2\2\u00a0\u00a2\5\34\17\2\u00a1\u00a0\3\2\2\2\u00a1\u00a2\3\2"+
-               
"\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a4\7\31\2\2\u00a4\u00a5\7,\2\2\u00a5"+
-               
"\33\3\2\2\2\u00a6\u00a7\b\17\1\2\u00a7\u00a8\7,\2\2\u00a8\u00ae\3\2\2"+
-               
"\2\u00a9\u00aa\f\3\2\2\u00aa\u00ab\7\35\2\2\u00ab\u00ad\7,\2\2\u00ac\u00a9"+
-               
"\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00af\3\2\2\2\u00af"+
-               
"\35\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00b2\7\17\2\2\u00b2\u00b3\7,\2"+
-               
"\2\u00b3\u00b4\7\20\2\2\u00b4\37\3\2\2\2\u00b5\u00b6\b\21\1\2\u00b6\u00be"+
-               "\5\"\22\2\u00b7\u00b8\7\17\2\2\u00b8\u00b9\5 
\21\2\u00b9\u00ba\7\20\2"+
-               "\2\u00ba\u00be\3\2\2\2\u00bb\u00bc\7\16\2\2\u00bc\u00be\5 
\21\3\u00bd"+
-               
"\u00b5\3\2\2\2\u00bd\u00b7\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be\u00c4\3\2"+
-               "\2\2\u00bf\u00c0\f\4\2\2\u00c0\u00c1\t\3\2\2\u00c1\u00c3\5 
\21\5\u00c2"+
-               
"\u00bf\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2"+
-               
"\2\2\u00c5!\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c7\u00c8\5$\23\2\u00c8\u00c9"+
-               
"\7\n\2\2\u00c9\u00ca\5$\23\2\u00ca#\3\2\2\2\u00cb\u00cc\b\23\1\2\u00cc"+
-               
"\u00d3\5(\25\2\u00cd\u00ce\7\17\2\2\u00ce\u00cf\5$\23\2\u00cf\u00d0\7"+
-               
"\20\2\2\u00d0\u00d3\3\2\2\2\u00d1\u00d3\5&\24\2\u00d2\u00cb\3\2\2\2\u00d2"+
-               
"\u00cd\3\2\2\2\u00d2\u00d1\3\2\2\2\u00d3\u00dc\3\2\2\2\u00d4\u00d5\f\4"+
-               
"\2\2\u00d5\u00d6\t\4\2\2\u00d6\u00db\5$\23\5\u00d7\u00d8\f\6\2\2\u00d8"+
-               
"\u00d9\7\32\2\2\u00d9\u00db\5(\25\2\u00da\u00d4\3\2\2\2\u00da\u00d7\3"+
-               
"\2\2\2\u00db\u00de\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd"+
-               
"%\3\2\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\7,\2\2\u00e0\u00e2\7\17\2\2"+
-               
"\u00e1\u00e3\5$\23\2\u00e2\u00e1\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e4"+
-               
"\3\2\2\2\u00e4\u00e5\7\20\2\2\u00e5\'\3\2\2\2\u00e6\u00f4\7(\2\2\u00e7"+
-               
"\u00e9\7\34\2\2\u00e8\u00e7\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u00ea\3"+
-               
"\2\2\2\u00ea\u00ec\7)\2\2\u00eb\u00ed\7*\2\2\u00ec\u00eb\3\2\2\2\u00ec"+
-               
"\u00ed\3\2\2\2\u00ed\u00ef\3\2\2\2\u00ee\u00f0\7+\2\2\u00ef\u00ee\3\2"+
-               
"\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f4\3\2\2\2\u00f1\u00f4\7\'\2\2\u00f2"+
-               
"\u00f4\5*\26\2\u00f3\u00e6\3\2\2\2\u00f3\u00e8\3\2\2\2\u00f3\u00f1\3\2"+
-               
"\2\2\u00f3\u00f2\3\2\2\2\u00f4)\3\2\2\2\u00f5\u00f6\t\5\2\2\u00f6+\3\2"+
-               
"\2\2\u00f7\u00fa\5.\30\2\u00f8\u00fa\5\60\31\2\u00f9\u00f7\3\2\2\2\u00f9"+
-               
"\u00f8\3\2\2\2\u00fa-\3\2\2\2\u00fb\u00fc\t\6\2\2\u00fc/\3\2\2\2\u00fd"+
-               
"\u00fe\7\27\2\2\u00fe\u00ff\7)\2\2\u00ff\u0100\7\32\2\2\u0100\u0101\7"+
-               
")\2\2\u0101\u0102\7\30\2\2\u0102\61\3\2\2\2\36\64\67:U\\dhkqy\u0080\u0089"+
-               
"\u0090\u009b\u009e\u00a1\u00ae\u00bd\u00c4\u00d2\u00da\u00dc\u00e2\u00e8"+
-               "\u00ec\u00ef\u00f3\u00f9";
+               
"\3\21\7\21\u00c3\n\21\f\21\16\21\u00c6\13\21\3\22\3\22\3\22\3\22\3\22"+
+               
"\5\22\u00cd\n\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u00d6\n\23\3"+
+               
"\23\3\23\3\23\3\23\3\23\3\23\7\23\u00de\n\23\f\23\16\23\u00e1\13\23\3"+
+               
"\24\3\24\3\24\5\24\u00e6\n\24\3\24\3\24\3\25\3\25\5\25\u00ec\n\25\3\25"+
+               
"\3\25\5\25\u00f0\n\25\3\25\5\25\u00f3\n\25\3\25\3\25\5\25\u00f7\n\25\3"+
+               
"\26\3\26\3\27\3\27\5\27\u00fd\n\27\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
+               "\3\31\3\31\2\6\24\34 
$\32\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&"+
+               "(*,.\60\2\7\4\2\25\25\37\37\3\2\13\f\5\2\34\34  
\"$\3\2\b\t\3\2 \"\2\u0113"+
+               
"\2\62\3\2\2\2\4?\3\2\2\2\6C\3\2\2\2\bG\3\2\2\2\nK\3\2\2\2\f\\\3\2\2\2"+
+               
"\16^\3\2\2\2\20q\3\2\2\2\22\u0080\3\2\2\2\24\u0082\3\2\2\2\26\u008c\3"+
+               
"\2\2\2\30\u008e\3\2\2\2\32\u00a1\3\2\2\2\34\u00a6\3\2\2\2\36\u00b1\3\2"+
+               "\2\2 
\u00bd\3\2\2\2\"\u00cc\3\2\2\2$\u00d5\3\2\2\2&\u00e2\3\2\2\2(\u00f6"+
+               
"\3\2\2\2*\u00f8\3\2\2\2,\u00fc\3\2\2\2.\u00fe\3\2\2\2\60\u0100\3\2\2\2"+
+               
"\62\64\5\4\3\2\63\65\5\6\4\2\64\63\3\2\2\2\64\65\3\2\2\2\65\67\3\2\2\2"+
+               
"\668\5\b\5\2\67\66\3\2\2\2\678\3\2\2\28:\3\2\2\29;\5\n\6\2:9\3\2\2\2:"+
+               
";\3\2\2\2;<\3\2\2\2<=\5\24\13\2=>\7\2\2\3>\3\3\2\2\2?@\7\3\2\2@A\7\37"+
+               
"\2\2AB\7,\2\2B\5\3\2\2\2CD\7\4\2\2DE\7\37\2\2EF\7\'\2\2F\7\3\2\2\2GH\7"+
+               
"\5\2\2HI\7\37\2\2IJ\5*\26\2J\t\3\2\2\2KL\7\6\2\2LM\7\37\2\2MN\5\f\7\2"+
+               
"N\13\3\2\2\2OP\7\21\2\2PU\5\16\b\2QR\7\32\2\2RT\5\16\b\2SQ\3\2\2\2TW\3"+
+               
"\2\2\2US\3\2\2\2UV\3\2\2\2VX\3\2\2\2WU\3\2\2\2XY\7\22\2\2Y]\3\2\2\2Z["+
+               
"\7\21\2\2[]\7\22\2\2\\O\3\2\2\2\\Z\3\2\2\2]\r\3\2\2\2^_\5*\26\2_`\7\33"+
+               
"\2\2`a\5\20\t\2a\17\3\2\2\2br\5*\26\2ce\7\34\2\2dc\3\2\2\2de\3\2\2\2e"+
+               
"f\3\2\2\2fh\7)\2\2gi\7*\2\2hg\3\2\2\2hi\3\2\2\2ik\3\2\2\2jl\7+\2\2kj\3"+
+               
"\2\2\2kl\3\2\2\2lr\3\2\2\2mr\5\f\7\2nr\5\22\n\2or\7\'\2\2pr\7(\2\2qb\3"+
+               
"\2\2\2qd\3\2\2\2qm\3\2\2\2qn\3\2\2\2qo\3\2\2\2qp\3\2\2\2r\21\3\2\2\2s"+
+               
"t\7\27\2\2ty\5\20\t\2uv\7\32\2\2vx\5\20\t\2wu\3\2\2\2x{\3\2\2\2yw\3\2"+
+               
"\2\2yz\3\2\2\2z|\3\2\2\2{y\3\2\2\2|}\7\30\2\2}\u0081\3\2\2\2~\177\7\27"+
+               
"\2\2\177\u0081\7\30\2\2\u0080s\3\2\2\2\u0080~\3\2\2\2\u0081\23\3\2\2\2"+
+               
"\u0082\u0083\b\13\1\2\u0083\u0084\5\30\r\2\u0084\u0089\3\2\2\2\u0085\u0086"+
+               
"\f\3\2\2\u0086\u0088\5\30\r\2\u0087\u0085\3\2\2\2\u0088\u008b\3\2\2\2"+
+               
"\u0089\u0087\3\2\2\2\u0089\u008a\3\2\2\2\u008a\25\3\2\2\2\u008b\u0089"+
+               
"\3\2\2\2\u008c\u008d\t\2\2\2\u008d\27\3\2\2\2\u008e\u0090\7\7\2\2\u008f"+
+               
"\u0091\5\36\20\2\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3"+
+               "\2\2\2\u0092\u009b\5\26\f\2\u0093\u0094\7\21\2\2\u0094\u0095\5 
\21\2\u0095"+
+               
"\u0096\7\22\2\2\u0096\u009c\3\2\2\2\u0097\u0098\7#\2\2\u0098\u0099\5\32"+
+               
"\16\2\u0099\u009a\7#\2\2\u009a\u009c\3\2\2\2\u009b\u0093\3\2\2\2\u009b"+
+               
"\u0097\3\2\2\2\u009c\u009e\3\2\2\2\u009d\u009f\5,\27\2\u009e\u009d\3\2"+
+               
"\2\2\u009e\u009f\3\2\2\2\u009f\31\3\2\2\2\u00a0\u00a2\5\34\17\2\u00a1"+
+               
"\u00a0\3\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a4\7\31"+
+               
"\2\2\u00a4\u00a5\7,\2\2\u00a5\33\3\2\2\2\u00a6\u00a7\b\17\1\2\u00a7\u00a8"+
+               
"\7,\2\2\u00a8\u00ae\3\2\2\2\u00a9\u00aa\f\3\2\2\u00aa\u00ab\7\35\2\2\u00ab"+
+               
"\u00ad\7,\2\2\u00ac\u00a9\3\2\2\2\u00ad\u00b0\3\2\2\2\u00ae\u00ac\3\2"+
+               
"\2\2\u00ae\u00af\3\2\2\2\u00af\35\3\2\2\2\u00b0\u00ae\3\2\2\2\u00b1\u00b2"+
+               
"\7\17\2\2\u00b2\u00b3\7,\2\2\u00b3\u00b4\7\20\2\2\u00b4\37\3\2\2\2\u00b5"+
+               
"\u00b6\b\21\1\2\u00b6\u00be\5\"\22\2\u00b7\u00b8\7\17\2\2\u00b8\u00b9"+
+               "\5 
\21\2\u00b9\u00ba\7\20\2\2\u00ba\u00be\3\2\2\2\u00bb\u00bc\7\16\2\2"+
+               "\u00bc\u00be\5 
\21\3\u00bd\u00b5\3\2\2\2\u00bd\u00b7\3\2\2\2\u00bd\u00bb"+
+               
"\3\2\2\2\u00be\u00c4\3\2\2\2\u00bf\u00c0\f\4\2\2\u00c0\u00c1\t\3\2\2\u00c1"+
+               "\u00c3\5 
\21\5\u00c2\u00bf\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c2\3\2"+
+               
"\2\2\u00c4\u00c5\3\2\2\2\u00c5!\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c7\u00c8"+
+               
"\5$\23\2\u00c8\u00c9\7\n\2\2\u00c9\u00ca\5$\23\2\u00ca\u00cd\3\2\2\2\u00cb"+
+               
"\u00cd\5$\23\2\u00cc\u00c7\3\2\2\2\u00cc\u00cb\3\2\2\2\u00cd#\3\2\2\2"+
+               
"\u00ce\u00cf\b\23\1\2\u00cf\u00d6\5(\25\2\u00d0\u00d1\7\17\2\2\u00d1\u00d2"+
+               
"\5$\23\2\u00d2\u00d3\7\20\2\2\u00d3\u00d6\3\2\2\2\u00d4\u00d6\5&\24\2"+
+               
"\u00d5\u00ce\3\2\2\2\u00d5\u00d0\3\2\2\2\u00d5\u00d4\3\2\2\2\u00d6\u00df"+
+               
"\3\2\2\2\u00d7\u00d8\f\4\2\2\u00d8\u00d9\t\4\2\2\u00d9\u00de\5$\23\5\u00da"+
+               
"\u00db\f\6\2\2\u00db\u00dc\7\32\2\2\u00dc\u00de\5(\25\2\u00dd\u00d7\3"+
+               
"\2\2\2\u00dd\u00da\3\2\2\2\u00de\u00e1\3\2\2\2\u00df\u00dd\3\2\2\2\u00df"+
+               
"\u00e0\3\2\2\2\u00e0%\3\2\2\2\u00e1\u00df\3\2\2\2\u00e2\u00e3\7,\2\2\u00e3"+
+               
"\u00e5\7\17\2\2\u00e4\u00e6\5$\23\2\u00e5\u00e4\3\2\2\2\u00e5\u00e6\3"+
+               
"\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\7\20\2\2\u00e8\'\3\2\2\2\u00e9"+
+               
"\u00f7\7(\2\2\u00ea\u00ec\7\34\2\2\u00eb\u00ea\3\2\2\2\u00eb\u00ec\3\2"+
+               
"\2\2\u00ec\u00ed\3\2\2\2\u00ed\u00ef\7)\2\2\u00ee\u00f0\7*\2\2\u00ef\u00ee"+
+               
"\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f2\3\2\2\2\u00f1\u00f3\7+\2\2\u00f2"+
+               
"\u00f1\3\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u00f7\3\2\2\2\u00f4\u00f7\7\'"+
+               
"\2\2\u00f5\u00f7\5*\26\2\u00f6\u00e9\3\2\2\2\u00f6\u00eb\3\2\2\2\u00f6"+
+               
"\u00f4\3\2\2\2\u00f6\u00f5\3\2\2\2\u00f7)\3\2\2\2\u00f8\u00f9\t\5\2\2"+
+               
"\u00f9+\3\2\2\2\u00fa\u00fd\5.\30\2\u00fb\u00fd\5\60\31\2\u00fc\u00fa"+
+               
"\3\2\2\2\u00fc\u00fb\3\2\2\2\u00fd-\3\2\2\2\u00fe\u00ff\t\6\2\2\u00ff"+
+               
"/\3\2\2\2\u0100\u0101\7\27\2\2\u0101\u0102\7)\2\2\u0102\u0103\7\32\2\2"+
+               
"\u0103\u0104\7)\2\2\u0104\u0105\7\30\2\2\u0105\61\3\2\2\2\37\64\67:U\\"+
+               
"dhkqy\u0080\u0089\u0090\u009b\u009e\u00a1\u00ae\u00bd\u00c4\u00cc\u00d5"+
+               "\u00dd\u00df\u00e5\u00eb\u00ef\u00f2\u00f6\u00fc";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
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 e25c33f..b70d4cb 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
@@ -20,6 +20,7 @@ package org.apache.nlpcraft.model.intent.impl.ver2
 import com.typesafe.scalalogging.LazyLogging
 import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.tree.ParseTreeWalker
+import org.apache.commons.lang3.StringUtils
 import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.model.NCToken
 import org.apache.nlpcraft.model.intent.impl.antlr4._
@@ -28,6 +29,8 @@ import org.apache.nlpcraft.model.intent.utils.ver2._
 import scala.collection.immutable.HashMap
 import scala.collection.mutable
 import scala.collection.mutable.ArrayBuffer
+import java.lang.{Double ⇒ JDouble, IllegalArgumentException ⇒ IAE, Long ⇒ 
JLong}
+import java.util.{List ⇒ JList, Map ⇒ JMap}
 
 object NCIntentDslCompiler extends LazyLogging {
     // Compiler cache.
@@ -60,6 +63,15 @@ object NCIntentDslCompiler extends LazyLogging {
         // Term's code, i.e. list of instructions.
         private var termCode = 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 asJLong(v: AnyRef): JLong = v.asInstanceOf[JLong]
+        private def asJDouble(v: AnyRef): JDouble = v.asInstanceOf[JDouble]
+        private def asString(v: AnyRef): String = v.asInstanceOf[String]
+        private def asJList(v: AnyRef): JList[_] = v.asInstanceOf[JList[_]]
+        private def isJList(v: AnyRef): Boolean = v.isInstanceOf[JList[_]]
+
         /**
          *
          * @param min
@@ -91,10 +103,17 @@ object NCIntentDslCompiler extends LazyLogging {
 
                     val NCDslTermRetVal(lastVal, usedTok) = stack.pop()
 
-                    val newVal = lastVal match {
-                        case list: List[_] ⇒ mkVal(ctx.`val`().getText) :: list
-                        case _ ⇒ List(lastVal)
-                    }
+                    // Only use Java collections.
+                    val newVal: AnyRef =
+                        if (lastVal.isInstanceOf[JList[Object]]) {
+                            val x = lastVal.asInstanceOf[JList[Object]]
+
+                            x.add(mkVal(ctx.`val`().getText))
+
+                            x
+                        }
+                        else
+                            java.util.Collections.singletonList(lastVal)
 
                     stack.push(NCDslTermRetVal(newVal, usedTok))
                 })
@@ -104,85 +123,80 @@ object NCIntentDslCompiler extends LazyLogging {
                     require(stack.size >= 2)
 
                     // Stack pop in reverse order of push...
-                    val NCDslTermRetVal(val2, usedTok2) = stack.pop()
-                    val NCDslTermRetVal(val1, usedTok1) = stack.pop()
-                    
-                    def push(any: Any): Unit = stack.push(NCDslTermRetVal(any, 
usedTok1 || usedTok2))
-                    def isLong(v: Any): Boolean = 
v.isInstanceOf[java.lang.Long]
-                    def isDouble(v: Any): Boolean = 
v.isInstanceOf[java.lang.Double]
-                    def isString(v: Any): Boolean = v.isInstanceOf[String]
-                    def asLong(v: Any): java.lang.Long = 
v.asInstanceOf[java.lang.Long]
-                    def asDouble(v: Any): java.lang.Double = 
v.asInstanceOf[java.lang.Double]
-                    def asString(v: Any): String = v.asInstanceOf[String]
-                    def asList(v: Any): List[_] = v.asInstanceOf[List[_]]
-                    def isList(v: Any): Boolean = v.isInstanceOf[List[_]]
+                    val NCDslTermRetVal(val2, f1) = stack.pop()
+                    val NCDslTermRetVal(val1, f2) = stack.pop()
+
+                    val usedTok = f1 || f2
                     
-                    def error(op: String): Unit =
-                        throw new IllegalArgumentException(s"Unexpected '$op' 
operation for values: $val1, $val2")
+                    def push(any: AnyRef): Unit = 
stack.push(NCDslTermRetVal(any, usedTok))
+                    def pushLong(any: Long): Unit = 
stack.push(NCDslTermRetVal(Long.box(any), usedTok))
+                    def pushDouble(any: Double): Unit = 
stack.push(NCDslTermRetVal(Double.box(any), usedTok))
+
+                    def error(op: String): Unit = throw new IAE(s"Unexpected 
'$op' operation for values: $val1, $val2")
                     
                     if (ctx.PLUS() != null) { // '+'.
-                        if (isList(val1) && isList(val2))
-                            push(asList(val1) ::: asList(val2))
-                        else if (isList(val1))
-                            push(val2 :: asList(val1))
-                        else if (isList(val2)) 
-                            push(val1 :: asList(val2))
+                        if (isJList(val1) && isJList(val2))
+                            push(asJList(val1) ::: asJList(val2))
+                        else if (isJList(val1))
+                            push(val2 :: asJList(val1))
+                        else if (isJList(val2))
+                            push(val1 :: asJList(val2))
                         else if (isString(val1) && isString(val2))
                             push(asString(val1) + asString(val2))
-                        else if (isLong(val1) && isLong(val2))
-                            push(asLong(val1).longValue() + 
asLong(val2).longValue())
-                        else if (isLong(val1) && isDouble(val2))
-                            push(asLong(val1).longValue() + 
asDouble(val2).doubleValue())
-                        else if (isDouble(val1) && isLong(val2))
-                            push(asDouble(val1).doubleValue() + 
asLong(val2).longValue())
-                        else if (isDouble(val1) && isDouble(val2))
-                            push(asDouble(val1).doubleValue() + 
asDouble(val2).doubleValue())
+                        else if (isJLong(val1) && isJLong(val2))
+                            pushLong(asJLong(val1).longValue() + 
asJLong(val2).longValue())
+                        else if (isJLong(val1) && isJDouble(val2))
+                            pushDouble(asJLong(val1).longValue() + 
asJDouble(val2).doubleValue())
+                        else if (isJDouble(val1) && isJLong(val2))
+                            pushDouble(asJDouble(val1).doubleValue() + 
asJLong(val2).longValue())
+                        else if (isJDouble(val1) && isJDouble(val2))
+                            pushDouble(asJDouble(val1).doubleValue() + 
asJDouble(val2).doubleValue())
                         else
                             error("+")
                     }
                     else if (ctx.MINUS() != null) { // '-'.
-                        if (isList(val1) && isList(val2))
-                            
push(asList(val1).filterNot(asInstanceOf[List[_]].toSet))
-                        else if (isList(val1))
-                            push(asList(val1).filter(_ != val1))
-                        else if (isLong(val1) && isLong(val2))
-                            push(asLong(val1).longValue() - 
asLong(val2).longValue())
-                        else if (isLong(val1) && isDouble(val2))
-                            push(asLong(val1).longValue() - 
asDouble(val2).doubleValue())
-                        else if (isDouble(val1) && isLong(val2))
-                            push(asDouble(val1).doubleValue() - 
asLong(val2).longValue())
-                        else if (isDouble(val1) && isDouble(val2))
-                            push(asDouble(val1).doubleValue() - 
asDouble(val2).doubleValue())
+                        if (isJList(val1) && isJList(val2))
+                            
push(asJList(val1).filterNot(asInstanceOf[List[_]].toSet))
+                        else if (isJList(val1))
+                            push(asJList(val1).filter(_ != val1))
+                        else if (isJLong(val1) && isJLong(val2))
+                            pushLong(asJLong(val1).longValue() - 
asJLong(val2).longValue())
+                        else if (isJLong(val1) && isJDouble(val2))
+                            pushDouble(asJLong(val1).longValue() - 
asJDouble(val2).doubleValue())
+                        else if (isJDouble(val1) && isJLong(val2))
+                            pushDouble(asJDouble(val1).doubleValue() - 
asJLong(val2).longValue())
+                        else if (isJDouble(val1) && isJDouble(val2))
+                            pushDouble(asJDouble(val1).doubleValue() - 
asJDouble(val2).doubleValue())
                         else
                             error("-")
                     }
                     else if (ctx.STAR() != null) { // '*'.
-                        if (isLong(val1) && isLong(val2))
-                            push(asLong(val1).longValue() * 
asLong(val2).longValue())
-                        else if (isLong(val1) && isDouble(val2))
-                            push(asLong(val1).longValue() * 
asDouble(val2).doubleValue())
-                        else if (isDouble(val1) && isLong(val2))
-                            push(asDouble(val1).doubleValue() * 
asLong(val2).longValue())
-                        else if (isDouble(val1) && isDouble(val2))
-                            push(asDouble(val1).doubleValue() * 
asDouble(val2).doubleValue())
+                        if (isJLong(val1) && isJLong(val2))
+                            pushLong(asJLong(val1).longValue() * 
asJLong(val2).longValue())
+                        else if (isJLong(val1) && isJDouble(val2))
+                            pushDouble(asJLong(val1).longValue() * 
asJDouble(val2).doubleValue())
+                        else if (isJDouble(val1) && isJLong(val2))
+                            pushDouble(asJDouble(val1).doubleValue() * 
asJLong(val2).longValue())
+                        else if (isJDouble(val1) && isJDouble(val2))
+                            pushDouble(asJDouble(val1).doubleValue() * 
asJDouble(val2).doubleValue())
                         else
                             error("*")
                     }
                     else if (ctx.FSLASH() != null) { // '/'.
-                        if (isLong(val1) && isLong(val2))
-                            push(asLong(val1).longValue() / 
asLong(val2).longValue())
-                        else if (isLong(val1) && isDouble(val2))
-                            push(asLong(val1).longValue() / 
asDouble(val2).doubleValue())
-                        else if (isDouble(val1) && isLong(val2))
-                            push(asDouble(val1).doubleValue() / 
asLong(val2).longValue())
-                        else if (isDouble(val1) && isDouble(val2))
-                            push(asDouble(val1).doubleValue() / 
asDouble(val2).doubleValue())
+                        if (isJLong(val1) && isJLong(val2))
+                            pushLong(asJLong(val1).longValue() / 
asJLong(val2).longValue())
+                        else if (isJLong(val1) && isJDouble(val2))
+                            pushDouble(asJLong(val1).longValue() / 
asJDouble(val2).doubleValue())
+                        else if (isJDouble(val1) && isJLong(val2))
+                            pushDouble(asJDouble(val1).doubleValue() / 
asJLong(val2).longValue())
+                        else if (isJDouble(val1) && isJDouble(val2))
+                            pushDouble(asJDouble(val1).doubleValue() / 
asJDouble(val2).doubleValue())
                         else
                             error("/")
                     }
                     else if (ctx.PERCENT() != null) { // '%'.
-                        if (isLong(val1) && isLong(val2))
-                            push(asLong(val1).longValue() % 
asLong(val2).longValue())
+                        if (isJLong(val1) && isJLong(val2))
+                            pushLong(asJLong(val1).longValue() % 
asJLong(val2).longValue())
                         else
                             error("%")
                     }
@@ -192,6 +206,143 @@ object NCIntentDslCompiler extends LazyLogging {
             }
         }
 
+        override def exitTermPred(ctx: NCIntentDslParser.TermPredContext): 
Unit = {
+
+
+        }
+
+        override def exitFunCall(ctx: NCIntentDslParser.FunCallContext): Unit 
= {
+            val fun = ctx.ID().getText
+
+            termCode += ((tok: NCToken, stack: StackType, ctx: 
NCDslTermContext) ⇒ {
+                val NCDslTermRetVal(param, usedTok) = if (stack.nonEmpty) 
stack.pop else (null, false)
+
+                def push(any: AnyRef, f: Boolean): Unit = 
stack.push(NCDslTermRetVal(any, f))
+                def pushLong(any: Long, f: Boolean): Unit = 
stack.push(NCDslTermRetVal(Long.box(any), f))
+                def pushDouble(any: Double, f: Boolean): Unit = 
stack.push(NCDslTermRetVal(Double.box(any), f))
+                def pushBoolean(any: Boolean, f: Boolean): Unit = 
stack.push(NCDslTermRetVal(Boolean.box(any), f))
+
+                def unknownFun(): Unit = throw new IAE(s"Unknown built-in 
function: $fun")
+                def errParamNum(): Unit = throw new IAE(s"Invalid number of 
parameters for built-in function: $fun")
+                def errParamType(): Unit = throw new IAE(s"Invalid parameter 
type for built-in function: $fun")
+
+                def check1String(): Unit = if (param == null) errParamNum() 
else if (!isString(param)) errParamType()
+                def check1Long(): Unit = if (param == null) errParamNum() else 
if (!isJLong(param)) errParamType()
+                def check1Double(): Unit = if (param == null) errParamNum() 
else if (!isJDouble(param)) errParamType()
+
+                def doTrim(): String = { check1String(); 
asString(param).strip() }
+                def doUppercase(): String = { check1String(); 
asString(param).toUpperCase() }
+                def doLowercase(): String = { check1String(); 
asString(param).toLowerCase() }
+                def doIsAlpha(): Boolean = { check1String(); 
StringUtils.isAlpha(asString(param)) }
+                def doIsNum(): Boolean = { check1String(); 
StringUtils.isNumeric(asString(param)) }
+                def doIsAlphaNum(): Boolean = { check1String(); 
StringUtils.isAlphanumeric(asString(param)) }
+                def doIsWhitespace(): Boolean = { check1String(); 
StringUtils.isWhitespace(asString(param)) }
+                def doIsAlphaSpace(): Boolean = { check1String(); 
StringUtils.isAlphaSpace(asString(param)) }
+                def doIsAlphaNumSpace(): Boolean = { check1String(); 
StringUtils.isAlphanumericSpace(asString(param)) }
+                def doIsNumSpace(): Boolean = { check1String(); 
StringUtils.isNumericSpace(asString(param)) }
+
+                fun match {
+                    // Metadata access.
+                    case "meta" ⇒
+
+                    // Converts JSON to map.
+                    case "json" ⇒
+
+                    // Inline if-statement.
+                    case "if" ⇒
+
+                    // Token functions.
+                    case "id" ⇒ push(tok.getId, true)
+                    case "ancestors" ⇒ push(tok.getAncestors, true)
+                    case "parent" ⇒ push(tok.getParentId, true)
+                    case "groups" ⇒ push(tok.getGroups, true)
+                    case "value" ⇒ push(tok.getValue, true)
+                    case "aliases" ⇒ push(tok.getAliases, true)
+                    case "start_idx" ⇒ pushLong(tok.getStartCharIndex, true)
+                    case "end_idx" ⇒ pushLong(tok.getEndCharIndex, true)
+
+                    // String functions.
+                    case "trim" ⇒ push(doTrim(), usedTok)
+                    case "strip" ⇒ push(doTrim(), usedTok)
+                    case "uppercase" ⇒ push(doUppercase(), usedTok)
+                    case "lowercase" ⇒ push(doLowercase(), usedTok)
+                    case "is_alpha" ⇒ pushBoolean(doIsAlpha(), usedTok)
+                    case "is_alphanum" ⇒ pushBoolean(doIsAlphaNum(), usedTok)
+                    case "is_whitespace" ⇒ pushBoolean(doIsWhitespace(), 
usedTok)
+                    case "is_numeric" ⇒ pushBoolean(doIsNum(), usedTok)
+                    case "is_numeric_space" ⇒ pushBoolean(doIsNumSpace(), 
usedTok)
+                    case "is_alpha_space" ⇒ pushBoolean(doIsAlphaSpace(), 
usedTok)
+                    case "is_alphanum_space" ⇒ 
pushBoolean(doIsAlphaNumSpace(), usedTok)
+                    case "substring" ⇒
+                    case "index" ⇒
+                    case "soundex" ⇒
+                    case "split" ⇒
+                    case "replace" ⇒
+
+                    // Math functions.
+                    case "abs" ⇒
+                    case "ceil" ⇒
+                    case "floor" ⇒
+                    case "rint" ⇒
+                    case "round" ⇒
+                    case "signum" ⇒
+                    case "sqrt" ⇒
+                    case "pi" ⇒
+                    case "acos" ⇒
+                    case "asin" ⇒
+                    case "atan" ⇒
+                    case "atn2" ⇒
+                    case "cos" ⇒
+                    case "cot" ⇒
+                    case "degrees" ⇒
+                    case "exp" ⇒
+                    case "log" ⇒
+                    case "log10" ⇒
+                    case "power" ⇒
+                    case "radians" ⇒
+                    case "rand" ⇒
+                    case "sin" ⇒
+                    case "square" ⇒
+                    case "tan" ⇒
+
+                    // Collection, statistical (incl. string) functions.
+                    case "avg" ⇒
+                    case "max" ⇒
+                    case "min" ⇒
+                    case "stdev" ⇒
+                    case "sum" ⇒
+                    case "get" ⇒
+                    case "index" ⇒
+                    case "contains" ⇒
+                    case "first" ⇒
+                    case "last" ⇒
+                    case "keys" ⇒
+                    case "values" ⇒
+                    case "length" ⇒
+                    case "count" ⇒
+                    case "size" ⇒
+                    case "reverse" ⇒
+                    case "is_empty" ⇒
+                    case "non_empty" ⇒
+                    case "to_string" ⇒
+
+                    // Date-time functions.
+                    case "year" ⇒
+                    case "month" ⇒
+                    case "day" ⇒
+                    case "hour" ⇒
+                    case "min" ⇒
+                    case "sec" ⇒
+                    case "week" ⇒
+                    case "quarter" ⇒
+                    case "msec" ⇒
+                    case "now" ⇒
+
+                    case _ ⇒ unknownFun()
+                }
+            })
+        }
+
         override def exitClsNer(ctx: NCIntentDslParser.ClsNerContext): Unit = {
             if (ctx.javaFqn() != null)
                 termClsName = ctx.javaFqn().getText.strip()
@@ -238,21 +389,21 @@ object NCIntentDslCompiler extends LazyLogging {
          * @param s
          * @return
          */
-        private def mkVal(s: String): Any = {
+        private def mkVal(s: String): Object = {
             if (s == "null") null // Try 'null'.
-            else if (s == "true") true // Try 'boolean'.
-            else if (s == "false") false // Try 'boolean'.
+            else if (s == "true") Boolean.box(true) // Try 'boolean'.
+            else if (s == "false") Boolean.box(false) // Try 'boolean'.
             // Only numeric or string values below...
             else {
                 // Strip '_' from numeric values.
                 val num = s.replaceAll("_", "")
 
                 try
-                    java.lang.Long.parseLong(num) // Try 'long'.
+                    Long.box(JLong.parseLong(num)) // Try 'long'.
                 catch {
                     case _: NumberFormatException ⇒
                         try
-                            java.lang.Double.parseDouble(num) // Try 'double'.
+                            Double.box(JDouble.parseDouble(num)) // Try 
'double'.
                         catch {
                             case _: NumberFormatException ⇒ s // String by 
default (incl. quotes).
                         }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslTermRetVal.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslTermRetVal.scala
index f9563a4..1030416 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslTermRetVal.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/ver2/NCDslTermRetVal.scala
@@ -21,6 +21,6 @@ package org.apache.nlpcraft.model.intent.utils.ver2
  *
  */
 case class NCDslTermRetVal (
-    retVal: Any,
+    retVal: AnyRef,
     usedTok: Boolean
 )

Reply via email to