This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch NLPCRAFT-247
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-247 by this push:
     new 099eda3  WIP.
099eda3 is described below

commit 099eda38d2d8e12fc7a02a07c29968dc9eccf333
Author: Aaron Radzinski <[email protected]>
AuthorDate: Wed Feb 24 13:07:34 2021 -0800

    WIP.
---
 .../nlpcraft/common/makro/NCMacroCompiler.scala    |  63 ++++----
 .../nlpcraft/common/makro/antlr4/NCMacroDsl.g4     |  13 +-
 .../nlpcraft/common/makro/antlr4/NCMacroDsl.interp |   9 +-
 .../nlpcraft/common/makro/antlr4/NCMacroDsl.tokens |  28 ++--
 .../makro/antlr4/NCMacroDslBaseListener.java       |  12 --
 .../common/makro/antlr4/NCMacroDslLexer.interp     |  12 +-
 .../common/makro/antlr4/NCMacroDslLexer.java       |  68 ++++----
 .../common/makro/antlr4/NCMacroDslLexer.tokens     |  28 ++--
 .../common/makro/antlr4/NCMacroDslListener.java    |  10 --
 .../common/makro/antlr4/NCMacroDslParser.java      | 174 +++++++--------------
 .../nlpcraft/examples/weather/weather_model.json   |   2 +-
 .../common/makro/NCMacroCompilerSpec.scala         |   1 -
 .../nlpcraft/common/makro/NCMacroParserSpec.scala  |   2 +-
 13 files changed, 158 insertions(+), 264 deletions(-)

diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroCompiler.scala
index d49d467..a4bf877 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/NCMacroCompiler.scala
@@ -49,10 +49,6 @@ object NCMacroCompiler extends LazyLogging {
     class FiniteStateMachine(parser: P, in: String) extends 
NCMacroDslBaseListener {
         private val stack = new mutable.ArrayStack[StackItem]
 
-        // Current min/max quantifier.
-        private var min = 1
-        private var max = 1
-
         private var expandedSyns: Set[String] = _
 
         /**
@@ -119,7 +115,36 @@ object NCMacroCompiler extends LazyLogging {
 
         override def exitGroup(ctx: NCMacroDslParser.GroupContext): Unit = {
             implicit val evidence: ParserRuleContext = ctx
-            
+
+            var min = 1
+            var max = 1
+
+            if (ctx.MINMAX() != null) {
+                var s = ctx.MINMAX().getText
+                val orig = s
+
+                s = s.substring(1, s.length - 1)
+
+                val comma = s.indexOf(',')
+
+                if (comma == -1 || comma == 0 || comma == s.length - 1)
+                    throw compilerError(s"Invalid min/max quantifier: $orig")
+
+                try
+                    min = java.lang.Integer.parseInt(s.substring(0, 
comma).trim)
+                catch {
+                    case _: NumberFormatException ⇒ throw 
compilerError(s"Invalid min quantifier: $orig")
+                }
+                try
+                    max = java.lang.Integer.parseInt(s.substring(comma + 
1).trim)
+                catch {
+                    case _: NumberFormatException ⇒ throw 
compilerError(s"Invalid max quantifier: $orig")
+                }
+
+                if (min < 0 || max < 0 || min > max || max == 0)
+                    throw compilerError(s"[$min,$max] quantifiers should 
satisfy 'max >= min, min >= 0, max > 0'.")
+            }
+
             val grp = stack.pop()
             
             // Remove dups.
@@ -134,16 +159,11 @@ object NCMacroCompiler extends LazyLogging {
             prn.buffer = prn.buffer.flatMap {
                 s ⇒ (for (z ← grp.buffer; i ← min to max) yield concat(s, s"$z 
" * i).trim).toSet
             }
-
-            // Reset min max.
-            min = 1
-            max = 1
         }
-    
+
         override def exitSyn(ctx: P.SynContext): Unit = {
             val syn = (
                 if (ctx.TXT() != null) ctx.TXT()
-                else if (ctx.INT() != null) ctx.INT()
                 else if (ctx.REGEX_TXT() != null) ctx.REGEX_TXT()
                 else ctx.DSL_TXT()
             ).getText
@@ -161,27 +181,6 @@ object NCMacroCompiler extends LazyLogging {
         override def exitMakro(ctx: P.MakroContext): Unit =
             expandedSyns = stack.pop().buffer.map(_.trim).toSet
     
-        override def exitMinMax(ctx: P.MinMaxContext): Unit = {
-            implicit val evidence: ParserRuleContext = ctx
-            
-            val minStr = ctx.getChild(1).getText.trim
-            val maxStr = ctx.getChild(3).getText.trim
-    
-            try
-                min = java.lang.Integer.parseInt(minStr)
-            catch {
-                case _: NumberFormatException ⇒ throw compilerError(s"Invalid 
min quantifier: $minStr")
-            }
-            try
-                max = java.lang.Integer.parseInt(maxStr)
-            catch {
-                case _: NumberFormatException ⇒ throw compilerError(s"Invalid 
max quantifier: $maxStr")
-            }
-            
-            if (min < 0 || max < 0 || min > max || max == 0)
-                throw compilerError(s"[$min,$max] quantifiers should satisfy 
'max >= min, min >= 0, max > 0'.")
-        }
-    
         /**
          *
          * @return
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
index d2a3ed8..bcc6ff3 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
@@ -24,9 +24,8 @@ expr
     | expr item
     ;
 item: syn | group;
-syn : (TXT | INT | REGEX_TXT | DSL_TXT); // NOTE: since TXT and INT overlap - 
we catch them both here and resolve in compiler.
-group: LCURLY list RCURLY minMax?;
-minMax: LBR INT COMMA INT RBR;
+syn : (TXT | REGEX_TXT | DSL_TXT); // NOTE: since TXT and INT overlap - we 
catch them both here and resolve in compiler.
+group: LCURLY list RCURLY MINMAX?;
 list
     : expr
     | list VERT expr
@@ -37,16 +36,14 @@ list
 // Lexer.
 LCURLY: '{';
 RCURLY: '}';
-LBR: '[';
-RBR: ']';
 VERT: '|';
 COMMA: ',';
 UNDERSCORE: '_';
 fragment ESC_CHAR: [{}\\_[\]|,];
 fragment ESC: '\\' ESC_CHAR;
 fragment TXT_CHAR
-    : [~!@#$%^&*()+.]
-    | [-=<>/\\;:`'"]
+    : [~!@#$%^&*()+._]
+    | [-=<>/\\;:`'",]
     | '\u00B7'
     | 'A'..'Z'
     | 'a'..'z'
@@ -73,7 +70,7 @@ fragment TXT_CHAR
     | '\uF900'..'\uFDCF'
     | '\uFDF0'..'\uFFFD'
     ; // Ignoring ['\u10000-'\uEFFFF].
-INT: '0' | [1-9][_0-9]*;
+MINMAX: '[' [ 0-9,]+ ']';
 REGEX_TXT: '//' .*? '//';
 DSL_TXT: '^^' .*? '^^';
 TXT: (TXT_CHAR | ESC)+;
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.interp
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.interp
index 502974a..d8e6b6a 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.interp
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.interp
@@ -2,8 +2,6 @@ token literal names:
 null
 '{'
 '}'
-'['
-']'
 '|'
 ','
 '_'
@@ -18,12 +16,10 @@ token symbolic names:
 null
 LCURLY
 RCURLY
-LBR
-RBR
 VERT
 COMMA
 UNDERSCORE
-INT
+MINMAX
 REGEX_TXT
 DSL_TXT
 TXT
@@ -36,9 +32,8 @@ expr
 item
 syn
 group
-minMax
 list
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 15, 66, 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, 
3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 25, 10, 3, 12, 3, 14, 3, 
28, 11, 3, 3, 4, 3, 4, 5, 4, 32, 10, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 
6, 40, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 
5, 8, 53, 10, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 61, 10, 8, 12, 8, 
14, 8, 64, 11, 8, 3, 8 [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 13, 58, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 3, 2, 3, 2, 
3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 23, 10, 3, 12, 3, 14, 3, 26, 11, 3, 
3, 4, 3, 4, 5, 4, 30, 10, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 38, 10, 
6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 45, 10, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 
3, 7, 7, 7, 53, 10, 7, 12, 7, 14, 7, 56, 11, 7, 3, 7, 2, 4, 4, 12, 8, 2, 4, 6, 
8, 10, 12, 2, 3, 3, 2 [...]
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.tokens
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.tokens
index ed5e876..4a59220 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.tokens
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.tokens
@@ -1,20 +1,16 @@
 LCURLY=1
 RCURLY=2
-LBR=3
-RBR=4
-VERT=5
-COMMA=6
-UNDERSCORE=7
-INT=8
-REGEX_TXT=9
-DSL_TXT=10
-TXT=11
-WS=12
-ERR_CHAR=13
+VERT=3
+COMMA=4
+UNDERSCORE=5
+MINMAX=6
+REGEX_TXT=7
+DSL_TXT=8
+TXT=9
+WS=10
+ERR_CHAR=11
 '{'=1
 '}'=2
-'['=3
-']'=4
-'|'=5
-','=6
-'_'=7
+'|'=3
+','=4
+'_'=5
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslBaseListener.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslBaseListener.java
index 66acd0f..35c078e 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslBaseListener.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslBaseListener.java
@@ -76,18 +76,6 @@ public class NCMacroDslBaseListener implements 
NCMacroDslListener {
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterMinMax(NCMacroDslParser.MinMaxContext ctx) { 
}
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation does nothing.</p>
-        */
-       @Override public void exitMinMax(NCMacroDslParser.MinMaxContext ctx) { }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation does nothing.</p>
-        */
        @Override public void enterList(NCMacroDslParser.ListContext ctx) { }
        /**
         * {@inheritDoc}
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.interp
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.interp
index 88fa60f..c069131 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.interp
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.interp
@@ -2,8 +2,6 @@ token literal names:
 null
 '{'
 '}'
-'['
-']'
 '|'
 ','
 '_'
@@ -18,12 +16,10 @@ token symbolic names:
 null
 LCURLY
 RCURLY
-LBR
-RBR
 VERT
 COMMA
 UNDERSCORE
-INT
+MINMAX
 REGEX_TXT
 DSL_TXT
 TXT
@@ -33,15 +29,13 @@ ERR_CHAR
 rule names:
 LCURLY
 RCURLY
-LBR
-RBR
 VERT
 COMMA
 UNDERSCORE
 ESC_CHAR
 ESC
 TXT_CHAR
-INT
+MINMAX
 REGEX_TXT
 DSL_TXT
 TXT
@@ -56,4 +50,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 15, 106, 8, 1, 
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, 3, 2, 3, 2, 3, 3, 3, 3, 3, 
4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 
10, 3, 10, 3, 11, 5, 11, 56, 10, 11, 3, 12, 3, 12, 3, 12, 7, 12, 61, 10, 12, 
12, 12, 14, 12, 64, 11, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 13, 96, 8, 1, 
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, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 
3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 5, 9, 48, 10, 9, 3, 10, 3, 10, 6, 10, 
52, 10, 10, 13, 10, 14, 10, 53, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 7, 
11, 62, 10, 11, 12, 11,  [...]
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.java
index 455cc2e..40885d5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.java
@@ -17,8 +17,8 @@ public class NCMacroDslLexer extends Lexer {
        protected static final PredictionContextCache _sharedContextCache =
                new PredictionContextCache();
        public static final int
-               LCURLY=1, RCURLY=2, LBR=3, RBR=4, VERT=5, COMMA=6, 
UNDERSCORE=7, INT=8, 
-               REGEX_TXT=9, DSL_TXT=10, TXT=11, WS=12, ERR_CHAR=13;
+               LCURLY=1, RCURLY=2, VERT=3, COMMA=4, UNDERSCORE=5, MINMAX=6, 
REGEX_TXT=7, 
+               DSL_TXT=8, TXT=9, WS=10, ERR_CHAR=11;
        public static String[] channelNames = {
                "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
        };
@@ -29,22 +29,22 @@ public class NCMacroDslLexer extends Lexer {
 
        private static String[] makeRuleNames() {
                return new String[] {
-                       "LCURLY", "RCURLY", "LBR", "RBR", "VERT", "COMMA", 
"UNDERSCORE", "ESC_CHAR", 
-                       "ESC", "TXT_CHAR", "INT", "REGEX_TXT", "DSL_TXT", 
"TXT", "WS", "ERR_CHAR"
+                       "LCURLY", "RCURLY", "VERT", "COMMA", "UNDERSCORE", 
"ESC_CHAR", "ESC", 
+                       "TXT_CHAR", "MINMAX", "REGEX_TXT", "DSL_TXT", "TXT", 
"WS", "ERR_CHAR"
                };
        }
        public static final String[] ruleNames = makeRuleNames();
 
        private static String[] makeLiteralNames() {
                return new String[] {
-                       null, "'{'", "'}'", "'['", "']'", "'|'", "','", "'_'"
+                       null, "'{'", "'}'", "'|'", "','", "'_'"
                };
        }
        private static final String[] _LITERAL_NAMES = makeLiteralNames();
        private static String[] makeSymbolicNames() {
                return new String[] {
-                       null, "LCURLY", "RCURLY", "LBR", "RBR", "VERT", 
"COMMA", "UNDERSCORE", 
-                       "INT", "REGEX_TXT", "DSL_TXT", "TXT", "WS", "ERR_CHAR"
+                       null, "LCURLY", "RCURLY", "VERT", "COMMA", 
"UNDERSCORE", "MINMAX", "REGEX_TXT", 
+                       "DSL_TXT", "TXT", "WS", "ERR_CHAR"
                };
        }
        private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -106,35 +106,33 @@ public class NCMacroDslLexer extends Lexer {
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\17j\b\1\4\2\t\2\4"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\r`\b\1\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\3\2\3\2\3"+
-               
"\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\13"+
-               
"\5\138\n\13\3\f\3\f\3\f\7\f=\n\f\f\f\16\f@\13\f\5\fB\n\f\3\r\3\r\3\r\3"+
-               
"\r\7\rH\n\r\f\r\16\rK\13\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\7\16T\n\16"+
-               
"\f\16\16\16W\13\16\3\16\3\16\3\16\3\17\3\17\6\17^\n\17\r\17\16\17_\3\20"+
-               
"\6\20c\n\20\r\20\16\20d\3\20\3\20\3\21\3\21\4IU\2\22\3\3\5\4\7\5\t\6\13"+
-               
"\7\r\b\17\t\21\2\23\2\25\2\27\n\31\13\33\f\35\r\37\16!\17\3\2\7\6\2.."+
-               
"]_aa}\177\21\2#-/@B\\^^``b|\u0080\u0080\u00a2\u2001\u200e\u200f\u2041"+
-               
"\u2042\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\3\2"+
-               
"\63;\4\2\62;aa\5\2\13\f\16\17\"\"\2m\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+
-               
"\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\27\3\2\2\2\2\31"+
-               
"\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\3#\3\2\2\2"+
-               
"\5%\3\2\2\2\7\'\3\2\2\2\t)\3\2\2\2\13+\3\2\2\2\r-\3\2\2\2\17/\3\2\2\2"+
-               
"\21\61\3\2\2\2\23\63\3\2\2\2\25\67\3\2\2\2\27A\3\2\2\2\31C\3\2\2\2\33"+
-               
"O\3\2\2\2\35]\3\2\2\2\37b\3\2\2\2!h\3\2\2\2#$\7}\2\2$\4\3\2\2\2%&\7\177"+
-               
"\2\2&\6\3\2\2\2\'(\7]\2\2(\b\3\2\2\2)*\7_\2\2*\n\3\2\2\2+,\7~\2\2,\f\3"+
-               
"\2\2\2-.\7.\2\2.\16\3\2\2\2/\60\7a\2\2\60\20\3\2\2\2\61\62\t\2\2\2\62"+
-               
"\22\3\2\2\2\63\64\7^\2\2\64\65\5\21\t\2\65\24\3\2\2\2\668\t\3\2\2\67\66"+
-               
"\3\2\2\28\26\3\2\2\29B\7\62\2\2:>\t\4\2\2;=\t\5\2\2<;\3\2\2\2=@\3\2\2"+
-               
"\2><\3\2\2\2>?\3\2\2\2?B\3\2\2\2@>\3\2\2\2A9\3\2\2\2A:\3\2\2\2B\30\3\2"+
-               
"\2\2CD\7\61\2\2DE\7\61\2\2EI\3\2\2\2FH\13\2\2\2GF\3\2\2\2HK\3\2\2\2IJ"+
-               
"\3\2\2\2IG\3\2\2\2JL\3\2\2\2KI\3\2\2\2LM\7\61\2\2MN\7\61\2\2N\32\3\2\2"+
-               
"\2OP\7`\2\2PQ\7`\2\2QU\3\2\2\2RT\13\2\2\2SR\3\2\2\2TW\3\2\2\2UV\3\2\2"+
-               
"\2US\3\2\2\2VX\3\2\2\2WU\3\2\2\2XY\7`\2\2YZ\7`\2\2Z\34\3\2\2\2[^\5\25"+
-               
"\13\2\\^\5\23\n\2][\3\2\2\2]\\\3\2\2\2^_\3\2\2\2_]\3\2\2\2_`\3\2\2\2`"+
-               
"\36\3\2\2\2ac\t\6\2\2ba\3\2\2\2cd\3\2\2\2db\3\2\2\2de\3\2\2\2ef\3\2\2"+
-               "\2fg\b\20\2\2g 
\3\2\2\2hi\13\2\2\2i\"\3\2\2\2\13\2\67>AIU]_d\3\b\2\2";
+               
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3"+
+               
"\5\3\6\3\6\3\7\3\7\3\b\3\b\3\b\3\t\5\t\60\n\t\3\n\3\n\6\n\64\n\n\r\n\16"+
+               
"\n\65\3\n\3\n\3\13\3\13\3\13\3\13\7\13>\n\13\f\13\16\13A\13\13\3\13\3"+
+               
"\13\3\13\3\f\3\f\3\f\3\f\7\fJ\n\f\f\f\16\fM\13\f\3\f\3\f\3\f\3\r\3\r\6"+
+               
"\rT\n\r\r\r\16\rU\3\16\6\16Y\n\16\r\16\16\16Z\3\16\3\16\3\17\3\17\4?K"+
+               
"\2\20\3\3\5\4\7\5\t\6\13\7\r\2\17\2\21\2\23\b\25\t\27\n\31\13\33\f\35"+
+               
"\r\3\2\6\6\2..]_aa}\177\17\2#@B\\^^`|\u0080\u0080\u00a2\u2001\u200e\u200f"+
+               
"\u2041\u2042\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff"+
+               
"\5\2\"\"..\62;\5\2\13\f\16\17\"\"\2b\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+
+               
"\2\2\t\3\2\2\2\2\13\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31"+
+               
"\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\3\37\3\2\2\2\5!\3\2\2\2\7#\3\2\2\2"+
+               
"\t%\3\2\2\2\13\'\3\2\2\2\r)\3\2\2\2\17+\3\2\2\2\21/\3\2\2\2\23\61\3\2"+
+               
"\2\2\259\3\2\2\2\27E\3\2\2\2\31S\3\2\2\2\33X\3\2\2\2\35^\3\2\2\2\37 \7"+
+               "}\2\2 
\4\3\2\2\2!\"\7\177\2\2\"\6\3\2\2\2#$\7~\2\2$\b\3\2\2\2%&\7.\2\2"+
+               
"&\n\3\2\2\2\'(\7a\2\2(\f\3\2\2\2)*\t\2\2\2*\16\3\2\2\2+,\7^\2\2,-\5\r"+
+               
"\7\2-\20\3\2\2\2.\60\t\3\2\2/.\3\2\2\2\60\22\3\2\2\2\61\63\7]\2\2\62\64"+
+               
"\t\4\2\2\63\62\3\2\2\2\64\65\3\2\2\2\65\63\3\2\2\2\65\66\3\2\2\2\66\67"+
+               
"\3\2\2\2\678\7_\2\28\24\3\2\2\29:\7\61\2\2:;\7\61\2\2;?\3\2\2\2<>\13\2"+
+               
"\2\2=<\3\2\2\2>A\3\2\2\2?@\3\2\2\2?=\3\2\2\2@B\3\2\2\2A?\3\2\2\2BC\7\61"+
+               
"\2\2CD\7\61\2\2D\26\3\2\2\2EF\7`\2\2FG\7`\2\2GK\3\2\2\2HJ\13\2\2\2IH\3"+
+               
"\2\2\2JM\3\2\2\2KL\3\2\2\2KI\3\2\2\2LN\3\2\2\2MK\3\2\2\2NO\7`\2\2OP\7"+
+               
"`\2\2P\30\3\2\2\2QT\5\21\t\2RT\5\17\b\2SQ\3\2\2\2SR\3\2\2\2TU\3\2\2\2"+
+               
"US\3\2\2\2UV\3\2\2\2V\32\3\2\2\2WY\t\5\2\2XW\3\2\2\2YZ\3\2\2\2ZX\3\2\2"+
+               
"\2Z[\3\2\2\2[\\\3\2\2\2\\]\b\16\2\2]\34\3\2\2\2^_\13\2\2\2_\36\3\2\2\2"+
+               "\n\2/\65?KSUZ\3\b\2\2";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.tokens
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.tokens
index ed5e876..4a59220 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.tokens
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslLexer.tokens
@@ -1,20 +1,16 @@
 LCURLY=1
 RCURLY=2
-LBR=3
-RBR=4
-VERT=5
-COMMA=6
-UNDERSCORE=7
-INT=8
-REGEX_TXT=9
-DSL_TXT=10
-TXT=11
-WS=12
-ERR_CHAR=13
+VERT=3
+COMMA=4
+UNDERSCORE=5
+MINMAX=6
+REGEX_TXT=7
+DSL_TXT=8
+TXT=9
+WS=10
+ERR_CHAR=11
 '{'=1
 '}'=2
-'['=3
-']'=4
-'|'=5
-','=6
-'_'=7
+'|'=3
+','=4
+'_'=5
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslListener.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslListener.java
index c7de456..eed7fb4 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslListener.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslListener.java
@@ -58,16 +58,6 @@ public interface NCMacroDslListener extends 
ParseTreeListener {
         */
        void exitGroup(NCMacroDslParser.GroupContext ctx);
        /**
-        * Enter a parse tree produced by {@link NCMacroDslParser#minMax}.
-        * @param ctx the parse tree
-        */
-       void enterMinMax(NCMacroDslParser.MinMaxContext ctx);
-       /**
-        * Exit a parse tree produced by {@link NCMacroDslParser#minMax}.
-        * @param ctx the parse tree
-        */
-       void exitMinMax(NCMacroDslParser.MinMaxContext ctx);
-       /**
         * Enter a parse tree produced by {@link NCMacroDslParser#list}.
         * @param ctx the parse tree
         */
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslParser.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslParser.java
index 04fd18b..626f67d 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslParser.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDslParser.java
@@ -17,28 +17,28 @@ public class NCMacroDslParser extends Parser {
        protected static final PredictionContextCache _sharedContextCache =
                new PredictionContextCache();
        public static final int
-               LCURLY=1, RCURLY=2, LBR=3, RBR=4, VERT=5, COMMA=6, 
UNDERSCORE=7, INT=8, 
-               REGEX_TXT=9, DSL_TXT=10, TXT=11, WS=12, ERR_CHAR=13;
+               LCURLY=1, RCURLY=2, VERT=3, COMMA=4, UNDERSCORE=5, MINMAX=6, 
REGEX_TXT=7, 
+               DSL_TXT=8, TXT=9, WS=10, ERR_CHAR=11;
        public static final int
                RULE_makro = 0, RULE_expr = 1, RULE_item = 2, RULE_syn = 3, 
RULE_group = 4, 
-               RULE_minMax = 5, RULE_list = 6;
+               RULE_list = 5;
        private static String[] makeRuleNames() {
                return new String[] {
-                       "makro", "expr", "item", "syn", "group", "minMax", 
"list"
+                       "makro", "expr", "item", "syn", "group", "list"
                };
        }
        public static final String[] ruleNames = makeRuleNames();
 
        private static String[] makeLiteralNames() {
                return new String[] {
-                       null, "'{'", "'}'", "'['", "']'", "'|'", "','", "'_'"
+                       null, "'{'", "'}'", "'|'", "','", "'_'"
                };
        }
        private static final String[] _LITERAL_NAMES = makeLiteralNames();
        private static String[] makeSymbolicNames() {
                return new String[] {
-                       null, "LCURLY", "RCURLY", "LBR", "RBR", "VERT", 
"COMMA", "UNDERSCORE", 
-                       "INT", "REGEX_TXT", "DSL_TXT", "TXT", "WS", "ERR_CHAR"
+                       null, "LCURLY", "RCURLY", "VERT", "COMMA", 
"UNDERSCORE", "MINMAX", "REGEX_TXT", 
+                       "DSL_TXT", "TXT", "WS", "ERR_CHAR"
                };
        }
        private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -117,9 +117,9 @@ public class NCMacroDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(14);
+                       setState(12);
                        expr(0);
-                       setState(15);
+                       setState(13);
                        match(EOF);
                        }
                }
@@ -171,11 +171,11 @@ public class NCMacroDslParser extends Parser {
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(18);
+                       setState(16);
                        item();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(24);
+                       setState(22);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -186,14 +186,14 @@ public class NCMacroDslParser extends Parser {
                                        {
                                        _localctx = new ExprContext(_parentctx, 
_parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_expr);
-                                       setState(20);
+                                       setState(18);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(21);
+                                       setState(19);
                                        item();
                                        }
                                        } 
                                }
-                               setState(26);
+                               setState(24);
                                _errHandler.sync(this);
                                _alt = 
getInterpreter().adaptivePredict(_input,0,_ctx);
                        }
@@ -235,23 +235,22 @@ public class NCMacroDslParser extends Parser {
                ItemContext _localctx = new ItemContext(_ctx, getState());
                enterRule(_localctx, 4, RULE_item);
                try {
-                       setState(29);
+                       setState(27);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
-                       case INT:
                        case REGEX_TXT:
                        case DSL_TXT:
                        case TXT:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(27);
+                               setState(25);
                                syn();
                                }
                                break;
                        case LCURLY:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(28);
+                               setState(26);
                                group();
                                }
                                break;
@@ -272,7 +271,6 @@ public class NCMacroDslParser extends Parser {
 
        public static class SynContext extends ParserRuleContext {
                public TerminalNode TXT() { return 
getToken(NCMacroDslParser.TXT, 0); }
-               public TerminalNode INT() { return 
getToken(NCMacroDslParser.INT, 0); }
                public TerminalNode REGEX_TXT() { return 
getToken(NCMacroDslParser.REGEX_TXT, 0); }
                public TerminalNode DSL_TXT() { return 
getToken(NCMacroDslParser.DSL_TXT, 0); }
                public SynContext(ParserRuleContext parent, int invokingState) {
@@ -296,9 +294,9 @@ public class NCMacroDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(31);
+                       setState(29);
                        _la = _input.LA(1);
-                       if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
INT) | (1L << REGEX_TXT) | (1L << DSL_TXT) | (1L << TXT))) != 0)) ) {
+                       if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
REGEX_TXT) | (1L << DSL_TXT) | (1L << TXT))) != 0)) ) {
                        _errHandler.recoverInline(this);
                        }
                        else {
@@ -325,9 +323,7 @@ public class NCMacroDslParser extends Parser {
                        return getRuleContext(ListContext.class,0);
                }
                public TerminalNode RCURLY() { return 
getToken(NCMacroDslParser.RCURLY, 0); }
-               public MinMaxContext minMax() {
-                       return getRuleContext(MinMaxContext.class,0);
-               }
+               public TerminalNode MINMAX() { return 
getToken(NCMacroDslParser.MINMAX, 0); }
                public GroupContext(ParserRuleContext parent, int 
invokingState) {
                        super(parent, invokingState);
                }
@@ -348,19 +344,19 @@ public class NCMacroDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(33);
+                       setState(31);
                        match(LCURLY);
-                       setState(34);
+                       setState(32);
                        list(0);
-                       setState(35);
+                       setState(33);
                        match(RCURLY);
-                       setState(37);
+                       setState(35);
                        _errHandler.sync(this);
                        switch ( 
getInterpreter().adaptivePredict(_input,2,_ctx) ) {
                        case 1:
                                {
-                               setState(36);
-                               minMax();
+                               setState(34);
+                               match(MINMAX);
                                }
                                break;
                        }
@@ -377,57 +373,6 @@ public class NCMacroDslParser extends Parser {
                return _localctx;
        }
 
-       public static class MinMaxContext extends ParserRuleContext {
-               public TerminalNode LBR() { return 
getToken(NCMacroDslParser.LBR, 0); }
-               public List<TerminalNode> INT() { return 
getTokens(NCMacroDslParser.INT); }
-               public TerminalNode INT(int i) {
-                       return getToken(NCMacroDslParser.INT, i);
-               }
-               public TerminalNode COMMA() { return 
getToken(NCMacroDslParser.COMMA, 0); }
-               public TerminalNode RBR() { return 
getToken(NCMacroDslParser.RBR, 0); }
-               public MinMaxContext(ParserRuleContext parent, int 
invokingState) {
-                       super(parent, invokingState);
-               }
-               @Override public int getRuleIndex() { return RULE_minMax; }
-               @Override
-               public void enterRule(ParseTreeListener listener) {
-                       if ( listener instanceof NCMacroDslListener ) 
((NCMacroDslListener)listener).enterMinMax(this);
-               }
-               @Override
-               public void exitRule(ParseTreeListener listener) {
-                       if ( listener instanceof NCMacroDslListener ) 
((NCMacroDslListener)listener).exitMinMax(this);
-               }
-       }
-
-       public final MinMaxContext minMax() throws RecognitionException {
-               MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-               enterRule(_localctx, 10, RULE_minMax);
-               try {
-                       enterOuterAlt(_localctx, 1);
-                       {
-                       setState(39);
-                       match(LBR);
-                       setState(40);
-                       match(INT);
-                       setState(41);
-                       match(COMMA);
-                       setState(42);
-                       match(INT);
-                       setState(43);
-                       match(RBR);
-                       }
-               }
-               catch (RecognitionException re) {
-                       _localctx.exception = re;
-                       _errHandler.reportError(this, re);
-                       _errHandler.recover(this, re);
-               }
-               finally {
-                       exitRule();
-               }
-               return _localctx;
-       }
-
        public static class ListContext extends ParserRuleContext {
                public ExprContext expr() {
                        return getRuleContext(ExprContext.class,0);
@@ -460,32 +405,31 @@ public class NCMacroDslParser extends Parser {
                int _parentState = getState();
                ListContext _localctx = new ListContext(_ctx, _parentState);
                ListContext _prevctx = _localctx;
-               int _startState = 12;
-               enterRecursionRule(_localctx, 12, RULE_list, _p);
+               int _startState = 10;
+               enterRecursionRule(_localctx, 10, RULE_list, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(50);
+                       setState(42);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case LCURLY:
-                       case INT:
                        case REGEX_TXT:
                        case DSL_TXT:
                        case TXT:
                                {
-                               setState(46);
+                               setState(38);
                                expr(0);
                                }
                                break;
                        case UNDERSCORE:
                                {
-                               setState(47);
+                               setState(39);
                                match(UNDERSCORE);
-                               setState(48);
+                               setState(40);
                                match(VERT);
-                               setState(49);
+                               setState(41);
                                list(1);
                                }
                                break;
@@ -493,7 +437,7 @@ public class NCMacroDslParser extends Parser {
                                throw new NoViableAltException(this);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(60);
+                       setState(52);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input,5,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -501,18 +445,18 @@ public class NCMacroDslParser extends Parser {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
                                        _prevctx = _localctx;
                                        {
-                                       setState(58);
+                                       setState(50);
                                        _errHandler.sync(this);
                                        switch ( 
getInterpreter().adaptivePredict(_input,4,_ctx) ) {
                                        case 1:
                                                {
                                                _localctx = new 
ListContext(_parentctx, _parentState);
                                                
pushNewRecursionContext(_localctx, _startState, RULE_list);
-                                               setState(52);
+                                               setState(44);
                                                if (!(precpred(_ctx, 3))) throw 
new FailedPredicateException(this, "precpred(_ctx, 3)");
-                                               setState(53);
+                                               setState(45);
                                                match(VERT);
-                                               setState(54);
+                                               setState(46);
                                                expr(0);
                                                }
                                                break;
@@ -520,18 +464,18 @@ public class NCMacroDslParser extends Parser {
                                                {
                                                _localctx = new 
ListContext(_parentctx, _parentState);
                                                
pushNewRecursionContext(_localctx, _startState, RULE_list);
-                                               setState(55);
+                                               setState(47);
                                                if (!(precpred(_ctx, 2))) throw 
new FailedPredicateException(this, "precpred(_ctx, 2)");
-                                               setState(56);
+                                               setState(48);
                                                match(VERT);
-                                               setState(57);
+                                               setState(49);
                                                match(UNDERSCORE);
                                                }
                                                break;
                                        }
                                        } 
                                }
-                               setState(62);
+                               setState(54);
                                _errHandler.sync(this);
                                _alt = 
getInterpreter().adaptivePredict(_input,5,_ctx);
                        }
@@ -552,7 +496,7 @@ public class NCMacroDslParser extends Parser {
                switch (ruleIndex) {
                case 1:
                        return expr_sempred((ExprContext)_localctx, predIndex);
-               case 6:
+               case 5:
                        return list_sempred((ListContext)_localctx, predIndex);
                }
                return true;
@@ -575,23 +519,21 @@ public class NCMacroDslParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\17B\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\3\2\3\2\3\2\3\3\3\3\3\3\3\3"+
-               "\3\3\7\3\31\n\3\f\3\16\3\34\13\3\3\4\3\4\5\4 
\n\4\3\5\3\5\3\6\3\6\3\6"+
-               
"\3\6\5\6(\n\6\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\5\b\65\n\b\3"+
-               
"\b\3\b\3\b\3\b\3\b\3\b\7\b=\n\b\f\b\16\b@\13\b\3\b\2\4\4\16\t\2\4\6\b"+
-               
"\n\f\16\2\3\3\2\n\r\2@\2\20\3\2\2\2\4\23\3\2\2\2\6\37\3\2\2\2\b!\3\2\2"+
-               
"\2\n#\3\2\2\2\f)\3\2\2\2\16\64\3\2\2\2\20\21\5\4\3\2\21\22\7\2\2\3\22"+
-               
"\3\3\2\2\2\23\24\b\3\1\2\24\25\5\6\4\2\25\32\3\2\2\2\26\27\f\3\2\2\27"+
-               
"\31\5\6\4\2\30\26\3\2\2\2\31\34\3\2\2\2\32\30\3\2\2\2\32\33\3\2\2\2\33"+
-               "\5\3\2\2\2\34\32\3\2\2\2\35 \5\b\5\2\36 
\5\n\6\2\37\35\3\2\2\2\37\36\3"+
-               "\2\2\2 
\7\3\2\2\2!\"\t\2\2\2\"\t\3\2\2\2#$\7\3\2\2$%\5\16\b\2%\'\7\4\2"+
-               
"\2&(\5\f\7\2\'&\3\2\2\2\'(\3\2\2\2(\13\3\2\2\2)*\7\5\2\2*+\7\n\2\2+,\7"+
-               
"\b\2\2,-\7\n\2\2-.\7\6\2\2.\r\3\2\2\2/\60\b\b\1\2\60\65\5\4\3\2\61\62"+
-               
"\7\t\2\2\62\63\7\7\2\2\63\65\5\16\b\3\64/\3\2\2\2\64\61\3\2\2\2\65>\3"+
-               
"\2\2\2\66\67\f\5\2\2\678\7\7\2\28=\5\4\3\29:\f\4\2\2:;\7\7\2\2;=\7\t\2"+
-               
"\2<\66\3\2\2\2<9\3\2\2\2=@\3\2\2\2><\3\2\2\2>?\3\2\2\2?\17\3\2\2\2@>\3"+
-               "\2\2\2\b\32\37\'\64<>";
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\r:\4\2\t\2\4\3\t"+
+               
"\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\7\3"+
+               
"\27\n\3\f\3\16\3\32\13\3\3\4\3\4\5\4\36\n\4\3\5\3\5\3\6\3\6\3\6\3\6\5"+
+               
"\6&\n\6\3\7\3\7\3\7\3\7\3\7\5\7-\n\7\3\7\3\7\3\7\3\7\3\7\3\7\7\7\65\n"+
+               
"\7\f\7\16\78\13\7\3\7\2\4\4\f\b\2\4\6\b\n\f\2\3\3\2\t\13\29\2\16\3\2\2"+
+               
"\2\4\21\3\2\2\2\6\35\3\2\2\2\b\37\3\2\2\2\n!\3\2\2\2\f,\3\2\2\2\16\17"+
+               
"\5\4\3\2\17\20\7\2\2\3\20\3\3\2\2\2\21\22\b\3\1\2\22\23\5\6\4\2\23\30"+
+               
"\3\2\2\2\24\25\f\3\2\2\25\27\5\6\4\2\26\24\3\2\2\2\27\32\3\2\2\2\30\26"+
+               
"\3\2\2\2\30\31\3\2\2\2\31\5\3\2\2\2\32\30\3\2\2\2\33\36\5\b\5\2\34\36"+
+               "\5\n\6\2\35\33\3\2\2\2\35\34\3\2\2\2\36\7\3\2\2\2\37 \t\2\2\2 
\t\3\2\2"+
+               
"\2!\"\7\3\2\2\"#\5\f\7\2#%\7\4\2\2$&\7\b\2\2%$\3\2\2\2%&\3\2\2\2&\13\3"+
+               
"\2\2\2\'(\b\7\1\2(-\5\4\3\2)*\7\7\2\2*+\7\5\2\2+-\5\f\7\3,\'\3\2\2\2,"+
+               
")\3\2\2\2-\66\3\2\2\2./\f\5\2\2/\60\7\5\2\2\60\65\5\4\3\2\61\62\f\4\2"+
+               
"\2\62\63\7\5\2\2\63\65\7\7\2\2\64.\3\2\2\2\64\61\3\2\2\2\658\3\2\2\2\66"+
+               
"\64\3\2\2\2\66\67\3\2\2\2\67\r\3\2\2\28\66\3\2\2\2\b\30\35%,\64\66";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json
index 94134e5..5625ebe 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json
@@ -27,7 +27,7 @@
       "id": "wt:phen",
       "description": "Weather phenomenon.",
       "synonyms": [
-        "{high sea|severe weather|hail|heat wave|cold 
wave|derecho|supercell|avalanche|cyclone|wildfire|landslide|firestorm|dust 
storm|thunder snow|winter 
storm|cloudburst|shower|condensation|precipitation|drizzle|rainstorm|rain 
storm|rainfall|rain|storm|sun|sunshine|cloud|hot|cold|dry|wet|wind||hurricane|typhoon|sand-storm|sand
 storm|tornado|humid|fog|snow|smog|black 
ice|haze|thundershower|thundersnow|sleet|drought|wildfire|blizzard|avalanche|mist|thunderstorm}",
+        "{high sea|severe weather|hail|heat wave|cold 
wave|derecho|supercell|avalanche|cyclone|wildfire|landslide|firestorm|dust 
storm|thunder snow|winter 
storm|cloudburst|shower|condensation|precipitation|drizzle|rainstorm|rain 
storm|rainfall|rain|storm|sun|sunshine|cloud|hot|cold|dry|wet|wind|hurricane|typhoon|sand-storm|sand
 storm|tornado|humid|fog|snow|smog|black 
ice|haze|thundershower|thundersnow|sleet|drought|wildfire|blizzard|avalanche|mist|thunderstorm}",
         "{weather 
{condition|temp|temperature|data|_}|condition|temp|temperature}"
       ]
     },
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroCompilerSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroCompilerSpec.scala
index 4560faa..96a993b 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroCompilerSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroCompilerSpec.scala
@@ -112,7 +112,6 @@ class NCMacroCompilerSpec {
         checkError("{A}[2.33, 1]")
         checkError("{A}[1:1]")
         checkError("{A}[1 1]")
-        checkError("{A|__}")
         checkError("A|__}")
         checkError("{A|__} }}")
         checkError("} {A|_}")
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroParserSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroParserSpec.scala
index 18cccbd..497f8aa 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroParserSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/common/makro/NCMacroParserSpec.scala
@@ -139,7 +139,7 @@ class NCMacroParserSpec  {
         checkEq("a {b}", Seq("a b"))
         checkEq("a {b} {c|_}", Seq("a b", "a b c"))
         checkEq("a {{b|c}}", Seq("a b", "a c"))
-        checkEq("a {b|_|{g}[1,2]}", Seq("a", "a b", "a g", "a g g"))
+        checkEq("a {b|_|{g\\}}[1,2]}", Seq("a", "a b", "a g}", "a g} g}"))
         checkEq("a {b|_|{//[]{}//}[1,2]}", Seq("a", "a b", "a //[]{}//", "a 
//[]{}// //[]{}//"))
         checkEq("a {b|_|{//[]^^// ^^{_}^^}[1,2]}", Seq("a", "a b", "a //[]^^// 
^^{_}^^", "a //[]^^// ^^{_}^^ //[]^^// ^^{_}^^"))
         checkEq("//[a-zA-Z0-9]+//", Seq("//[a-zA-Z0-9]+//"))

Reply via email to