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

commit 8484db578716075a999fd18abaaba536365f556e
Author: Aaron Radzinzski <[email protected]>
AuthorDate: Sun Feb 21 21:58:26 2021 -0800

    WIP.
---
 .../nlpcraft/common/makro/NCMacroCompiler.scala    |  47 +++--
 .../nlpcraft/common/makro/antlr4/NCMacroDsl.g4     |  10 +-
 .../nlpcraft/common/makro/antlr4/NCMacroDsl.interp |   3 +-
 .../makro/antlr4/NCMacroDslBaseListener.java       |  14 +-
 .../common/makro/antlr4/NCMacroDslLexer.java       |   2 +-
 .../common/makro/antlr4/NCMacroDslListener.java    |  12 +-
 .../common/makro/antlr4/NCMacroDslParser.java      | 235 +++++++++++++--------
 .../common/makro/NCMacroCompilerSpec.scala         |  11 +
 8 files changed, 220 insertions(+), 114 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 105b9ea..5bdc38d 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
@@ -24,7 +24,6 @@ import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.makro.antlr4._
 import org.apache.nlpcraft.common.makro.antlr4.{NCMacroDslParser ⇒ P}
 import scala.collection.mutable
-import scala.collection.mutable.ListBuffer
 
 /**
   *
@@ -37,7 +36,7 @@ object NCMacroCompiler extends LazyLogging {
       * @param inGroup
       */
     case class StackItem (
-        buffer: mutable.Buffer[String],
+        var buffer: mutable.Buffer[String],
         inGroup: Boolean
     )
     
@@ -54,8 +53,6 @@ object NCMacroCompiler extends LazyLogging {
         
         private var expandedSyns: Set[String] = _
         
-        def pushNew(inGroup: Boolean): Unit = stack.push(StackItem(new 
ListBuffer[String](), inGroup))
-    
         /**
           *
           * @param errMsg
@@ -64,10 +61,23 @@ object NCMacroCompiler extends LazyLogging {
           */
         def error(errMsg: String)(implicit ctx: ParserRuleContext): 
RecognitionException =
             new RecognitionException(errMsg, parser, parser.getInputStream, 
ctx)
-        
-        // Push new container at the beginning and at each new group.
-        override def enterLine(ctx: P.LineContext): Unit = pushNew(false)
-        override def enterGroup(ctx: P.GroupContext): Unit = pushNew(true)
+    
+        override def enterMakro(ctx: NCMacroDslParser.MakroContext): Unit = {
+            val buf = mutable.Buffer.empty[String]
+            
+            buf += ""
+            
+            stack.push(StackItem(buf, false))
+        }
+    
+        override def enterGroup(ctx: P.GroupContext): Unit =
+            stack.push(StackItem(mutable.Buffer.empty[String], true))
+            
+        private def add(optS: String, s: String): String =
+            if (optS.isEmpty)
+                s
+            else
+                optS + " " + s
         
         override def exitGroup(ctx: NCMacroDslParser.GroupContext): Unit = {
             val top = stack.pop()
@@ -75,12 +85,12 @@ object NCMacroCompiler extends LazyLogging {
             require(top.inGroup)
             
             val arg = stack.top
-            
-            arg.buffer.flatMap { s ⇒
+    
+            arg.buffer = arg.buffer.flatMap { s ⇒
                 (
                     for (z ← top.buffer) yield
                         for (i ← min to max) yield
-                            s + " " + (s"$z " * i)
+                            add(s, (s"$z " * i)).trim
                 )
                 .flatten.toSet
             }
@@ -98,12 +108,17 @@ object NCMacroCompiler extends LazyLogging {
             if (top.inGroup)
                 buf += syn
             else {
-                if (buf.isEmpty) buf += syn else buf.map(_ + " " + syn)
+                if (buf.isEmpty)
+                    buf += syn
+                else
+                    for (i ← buf.indices) buf.update(i, add(buf(i), syn))
             }
         }
     
-        override def exitList(ctx: P.ListContext): Unit = if (ctx.UNDERSCORE() 
!= null) stack.top.buffer += ""
-        override def exitLine(ctx: P.LineContext): Unit = expandedSyns = 
stack.pop().buffer.map(_.trim).toSet
+        override def exitList(ctx: P.ListContext): Unit =
+            if (ctx.UNDERSCORE() != null) stack.top.buffer += ""
+        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
@@ -172,7 +187,7 @@ object NCMacroCompiler extends LazyLogging {
 
             val errMsg = s"Macro syntax error at line $line:$charPos - $msg\n" 
+
                 s"  |-- ${c("Macro:")} $in\n" +
-                s"  +-- ${c("Error:")}  ${makeCharPosPointer(in.length, 
charPos)}"
+                s"  +-- ${c("Error:")} ${makeCharPosPointer(in.length, 
charPos)}"
 
             throw new NCE(errMsg)
         }
@@ -199,7 +214,7 @@ object NCMacroCompiler extends LazyLogging {
         val fsm = new FiniteStateMachine(parser)
 
         // Parse the input DSL and walk built AST.
-        (new ParseTreeWalker).walk(fsm, parser.line())
+        (new ParseTreeWalker).walk(fsm, parser.makro())
 
         // Return the expanded macro.
         fsm.getExpandedMacro
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 a8951c7..9a9f3fb 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
@@ -17,14 +17,12 @@
 
 grammar NCMacroDsl;
 
+makro: line;
 line
-    : syn
-    | line syn
-    ;
-syn
-    : (TXT | INT) // NOTE: since TXT and INT overlap - we catch them both here 
and resolve in compiler.
-    | group
+    : (syn | group)
+    | line (syn | group)
     ;
+syn : (TXT | INT); // 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;
 list
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 121ec4a..fe4c49c 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
@@ -27,6 +27,7 @@ WS
 ErrorCharacter
 
 rule names:
+makro
 line
 syn
 group
@@ -35,4 +36,4 @@ list
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 13, 53, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, 2, 3, 2, 
3, 2, 7, 2, 18, 10, 2, 12, 2, 14, 2, 21, 11, 2, 3, 3, 3, 3, 5, 3, 25, 10, 3, 3, 
4, 3, 4, 3, 4, 3, 4, 5, 4, 31, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 
3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 46, 10, 6, 7, 6, 48, 10, 6, 12, 6, 
14, 6, 51, 11, 6, 3, 6, 2, 4, 2, 10, 7, 2, 4, 6, 8, 10, 2, 3, 3, 2, 10, 11, 2, 
52, 2, 12, 3, 2, 2, 2 [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 13, 60, 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, 3, 3, 3, 3, 3, 5, 3, 20, 10, 3, 3, 3, 3, 3, 3, 3, 5, 3, 25, 10, 3, 7, 3, 27, 
10, 3, 12, 3, 14, 3, 30, 11, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 38, 
10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 
3, 7, 5, 7, 53, 10, 7, 7, 7, 55, 10, 7, 12, 7, 14, 7, 58, 11, 7, 3, 7, 2, 4, 4, 
12, 8, 2, 4, 6, 8, 1 [...]
\ No newline at end of file
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 0633a30..bfbd231 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
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4\NCMacroDsl.g4
 by ANTLR 4.9.1
+// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.common.makro.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
@@ -16,6 +16,18 @@ public class NCMacroDslBaseListener implements 
NCMacroDslListener {
         *
         * <p>The default implementation does nothing.</p>
         */
+       @Override public void enterMakro(NCMacroDslParser.MakroContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitMakro(NCMacroDslParser.MakroContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
        @Override public void enterLine(NCMacroDslParser.LineContext ctx) { }
        /**
         * {@inheritDoc}
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 1a45648..56b3382 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
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4\NCMacroDsl.g4
 by ANTLR 4.9.1
+// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.common.makro.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
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 3e7cfa3..1621ba0 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
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4\NCMacroDsl.g4
 by ANTLR 4.9.1
+// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.common.makro.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
@@ -8,6 +8,16 @@ import org.antlr.v4.runtime.tree.ParseTreeListener;
  */
 public interface NCMacroDslListener extends ParseTreeListener {
        /**
+        * Enter a parse tree produced by {@link NCMacroDslParser#makro}.
+        * @param ctx the parse tree
+        */
+       void enterMakro(NCMacroDslParser.MakroContext ctx);
+       /**
+        * Exit a parse tree produced by {@link NCMacroDslParser#makro}.
+        * @param ctx the parse tree
+        */
+       void exitMakro(NCMacroDslParser.MakroContext ctx);
+       /**
         * Enter a parse tree produced by {@link NCMacroDslParser#line}.
         * @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 9b051d7..0f42537 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
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita 
Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4\NCMacroDsl.g4
 by ANTLR 4.9.1
+// Generated from 
/Users/nivanov/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/common/makro/antlr4/NCMacroDsl.g4
 by ANTLR 4.9.1
 package org.apache.nlpcraft.common.makro.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
@@ -20,10 +20,11 @@ public class NCMacroDslParser extends Parser {
                LCURLY=1, RCURLY=2, LBR=3, RBR=4, VERT=5, COMMA=6, 
UNDERSCORE=7, INT=8, 
                TXT=9, WS=10, ErrorCharacter=11;
        public static final int
-               RULE_line = 0, RULE_syn = 1, RULE_group = 2, RULE_minMax = 3, 
RULE_list = 4;
+               RULE_makro = 0, RULE_line = 1, RULE_syn = 2, RULE_group = 3, 
RULE_minMax = 4, 
+               RULE_list = 5;
        private static String[] makeRuleNames() {
                return new String[] {
-                       "line", "syn", "group", "minMax", "list"
+                       "makro", "line", "syn", "group", "minMax", "list"
                };
        }
        public static final String[] ruleNames = makeRuleNames();
@@ -91,10 +92,52 @@ public class NCMacroDslParser extends Parser {
                _interp = new 
ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
        }
 
+       public static class MakroContext extends ParserRuleContext {
+               public LineContext line() {
+                       return getRuleContext(LineContext.class,0);
+               }
+               public MakroContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_makro; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCMacroDslListener ) 
((NCMacroDslListener)listener).enterMakro(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCMacroDslListener ) 
((NCMacroDslListener)listener).exitMakro(this);
+               }
+       }
+
+       public final MakroContext makro() throws RecognitionException {
+               MakroContext _localctx = new MakroContext(_ctx, getState());
+               enterRule(_localctx, 0, RULE_makro);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(12);
+                       line(0);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
        public static class LineContext extends ParserRuleContext {
                public SynContext syn() {
                        return getRuleContext(SynContext.class,0);
                }
+               public GroupContext group() {
+                       return getRuleContext(GroupContext.class,0);
+               }
                public LineContext line() {
                        return getRuleContext(LineContext.class,0);
                }
@@ -121,20 +164,37 @@ public class NCMacroDslParser extends Parser {
                int _parentState = getState();
                LineContext _localctx = new LineContext(_ctx, _parentState);
                LineContext _prevctx = _localctx;
-               int _startState = 0;
-               enterRecursionRule(_localctx, 0, RULE_line, _p);
+               int _startState = 2;
+               enterRecursionRule(_localctx, 2, RULE_line, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(11);
-                       syn();
+                       setState(17);
+                       _errHandler.sync(this);
+                       switch (_input.LA(1)) {
+                       case INT:
+                       case TXT:
+                               {
+                               setState(15);
+                               syn();
+                               }
+                               break;
+                       case LCURLY:
+                               {
+                               setState(16);
+                               group();
+                               }
+                               break;
+                       default:
+                               throw new NoViableAltException(this);
+                       }
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(17);
+                       setState(26);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,0,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,2,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -143,16 +203,33 @@ public class NCMacroDslParser extends Parser {
                                        {
                                        _localctx = new LineContext(_parentctx, 
_parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_line);
-                                       setState(13);
+                                       setState(19);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(14);
-                                       syn();
+                                       setState(22);
+                                       _errHandler.sync(this);
+                                       switch (_input.LA(1)) {
+                                       case INT:
+                                       case TXT:
+                                               {
+                                               setState(20);
+                                               syn();
+                                               }
+                                               break;
+                                       case LCURLY:
+                                               {
+                                               setState(21);
+                                               group();
+                                               }
+                                               break;
+                                       default:
+                                               throw new 
NoViableAltException(this);
+                                       }
                                        }
                                        } 
                                }
-                               setState(19);
+                               setState(28);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,0,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,2,_ctx);
                        }
                        }
                }
@@ -170,9 +247,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 GroupContext group() {
-                       return getRuleContext(GroupContext.class,0);
-               }
                public SynContext(ParserRuleContext parent, int invokingState) {
                        super(parent, invokingState);
                }
@@ -189,37 +263,21 @@ public class NCMacroDslParser extends Parser {
 
        public final SynContext syn() throws RecognitionException {
                SynContext _localctx = new SynContext(_ctx, getState());
-               enterRule(_localctx, 2, RULE_syn);
+               enterRule(_localctx, 4, RULE_syn);
                int _la;
                try {
-                       setState(22);
-                       _errHandler.sync(this);
-                       switch (_input.LA(1)) {
-                       case INT:
-                       case TXT:
-                               enterOuterAlt(_localctx, 1);
-                               {
-                               setState(20);
-                               _la = _input.LA(1);
-                               if ( !(_la==INT || _la==TXT) ) {
-                               _errHandler.recoverInline(this);
-                               }
-                               else {
-                                       if ( _input.LA(1)==Token.EOF ) 
matchedEOF = true;
-                                       _errHandler.reportMatch(this);
-                                       consume();
-                               }
-                               }
-                               break;
-                       case LCURLY:
-                               enterOuterAlt(_localctx, 2);
-                               {
-                               setState(21);
-                               group();
-                               }
-                               break;
-                       default:
-                               throw new NoViableAltException(this);
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(29);
+                       _la = _input.LA(1);
+                       if ( !(_la==INT || _la==TXT) ) {
+                       _errHandler.recoverInline(this);
+                       }
+                       else {
+                               if ( _input.LA(1)==Token.EOF ) matchedEOF = 
true;
+                               _errHandler.reportMatch(this);
+                               consume();
+                       }
                        }
                }
                catch (RecognitionException re) {
@@ -258,22 +316,22 @@ public class NCMacroDslParser extends Parser {
 
        public final GroupContext group() throws RecognitionException {
                GroupContext _localctx = new GroupContext(_ctx, getState());
-               enterRule(_localctx, 4, RULE_group);
+               enterRule(_localctx, 6, RULE_group);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(24);
+                       setState(31);
                        match(LCURLY);
-                       setState(25);
+                       setState(32);
                        list(0);
-                       setState(26);
+                       setState(33);
                        match(RCURLY);
-                       setState(28);
+                       setState(35);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,2,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,3,_ctx) ) {
                        case 1:
                                {
-                               setState(27);
+                               setState(34);
                                minMax();
                                }
                                break;
@@ -315,19 +373,19 @@ public class NCMacroDslParser extends Parser {
 
        public final MinMaxContext minMax() throws RecognitionException {
                MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-               enterRule(_localctx, 6, RULE_minMax);
+               enterRule(_localctx, 8, RULE_minMax);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(30);
+                       setState(37);
                        match(LBR);
-                       setState(31);
+                       setState(38);
                        match(INT);
-                       setState(32);
+                       setState(39);
                        match(COMMA);
-                       setState(33);
+                       setState(40);
                        match(INT);
-                       setState(34);
+                       setState(41);
                        match(RBR);
                        }
                }
@@ -374,20 +432,20 @@ public class NCMacroDslParser extends Parser {
                int _parentState = getState();
                ListContext _localctx = new ListContext(_ctx, _parentState);
                ListContext _prevctx = _localctx;
-               int _startState = 8;
-               enterRecursionRule(_localctx, 8, RULE_list, _p);
+               int _startState = 10;
+               enterRecursionRule(_localctx, 10, RULE_list, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(37);
+                       setState(44);
                        syn();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(47);
+                       setState(54);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,5,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -396,24 +454,23 @@ public class NCMacroDslParser extends Parser {
                                        {
                                        _localctx = new ListContext(_parentctx, 
_parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_list);
-                                       setState(39);
+                                       setState(46);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(40);
+                                       setState(47);
                                        match(VERT);
-                                       setState(43);
+                                       setState(50);
                                        _errHandler.sync(this);
                                        switch (_input.LA(1)) {
-                                       case LCURLY:
                                        case INT:
                                        case TXT:
                                                {
-                                               setState(41);
+                                               setState(48);
                                                syn();
                                                }
                                                break;
                                        case UNDERSCORE:
                                                {
-                                               setState(42);
+                                               setState(49);
                                                match(UNDERSCORE);
                                                }
                                                break;
@@ -423,9 +480,9 @@ public class NCMacroDslParser extends Parser {
                                        }
                                        } 
                                }
-                               setState(49);
+                               setState(56);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,4,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,5,_ctx);
                        }
                        }
                }
@@ -442,9 +499,9 @@ public class NCMacroDslParser extends Parser {
 
        public boolean sempred(RuleContext _localctx, int ruleIndex, int 
predIndex) {
                switch (ruleIndex) {
-               case 0:
+               case 1:
                        return line_sempred((LineContext)_localctx, predIndex);
-               case 4:
+               case 5:
                        return list_sempred((ListContext)_localctx, predIndex);
                }
                return true;
@@ -465,20 +522,22 @@ public class NCMacroDslParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\r\65\4\2\t\2\4\3"+
-               
"\t\3\4\4\t\4\4\5\t\5\4\6\t\6\3\2\3\2\3\2\3\2\3\2\7\2\22\n\2\f\2\16\2\25"+
-               
"\13\2\3\3\3\3\5\3\31\n\3\3\4\3\4\3\4\3\4\5\4\37\n\4\3\5\3\5\3\5\3\5\3"+
-               
"\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6.\n\6\7\6\60\n\6\f\6\16\6\63\13"+
-               
"\6\3\6\2\4\2\n\7\2\4\6\b\n\2\3\3\2\n\13\2\64\2\f\3\2\2\2\4\30\3\2\2\2"+
-               "\6\32\3\2\2\2\b 
\3\2\2\2\n&\3\2\2\2\f\r\b\2\1\2\r\16\5\4\3\2\16\23\3\2"+
-               
"\2\2\17\20\f\3\2\2\20\22\5\4\3\2\21\17\3\2\2\2\22\25\3\2\2\2\23\21\3\2"+
-               
"\2\2\23\24\3\2\2\2\24\3\3\2\2\2\25\23\3\2\2\2\26\31\t\2\2\2\27\31\5\6"+
-               
"\4\2\30\26\3\2\2\2\30\27\3\2\2\2\31\5\3\2\2\2\32\33\7\3\2\2\33\34\5\n"+
-               
"\6\2\34\36\7\4\2\2\35\37\5\b\5\2\36\35\3\2\2\2\36\37\3\2\2\2\37\7\3\2"+
-               "\2\2 
!\7\5\2\2!\"\7\n\2\2\"#\7\b\2\2#$\7\n\2\2$%\7\6\2\2%\t\3\2\2\2&\'"+
-               
"\b\6\1\2\'(\5\4\3\2(\61\3\2\2\2)*\f\3\2\2*-\7\7\2\2+.\5\4\3\2,.\7\t\2"+
-               
"\2-+\3\2\2\2-,\3\2\2\2.\60\3\2\2\2/)\3\2\2\2\60\63\3\2\2\2\61/\3\2\2\2"+
-               "\61\62\3\2\2\2\62\13\3\2\2\2\63\61\3\2\2\2\7\23\30\36-\61";
+               
"\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\3\3\3\3\3\5\3\24\n\3\3\3"+
+               
"\3\3\3\3\5\3\31\n\3\7\3\33\n\3\f\3\16\3\36\13\3\3\4\3\4\3\5\3\5\3\5\3"+
+               
"\5\5\5&\n\5\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\5\7\65"+
+               
"\n\7\7\7\67\n\7\f\7\16\7:\13\7\3\7\2\4\4\f\b\2\4\6\b\n\f\2\3\3\2\n\13"+
+               
"\2;\2\16\3\2\2\2\4\20\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\17\5\4\3\2\17\3\3\2\2\2\20\23\b\3\1\2\21\24\5\6\4\2\22\24\5"+
+               
"\b\5\2\23\21\3\2\2\2\23\22\3\2\2\2\24\34\3\2\2\2\25\30\f\3\2\2\26\31\5"+
+               
"\6\4\2\27\31\5\b\5\2\30\26\3\2\2\2\30\27\3\2\2\2\31\33\3\2\2\2\32\25\3"+
+               
"\2\2\2\33\36\3\2\2\2\34\32\3\2\2\2\34\35\3\2\2\2\35\5\3\2\2\2\36\34\3"+
+               "\2\2\2\37 \t\2\2\2 
\7\3\2\2\2!\"\7\3\2\2\"#\5\f\7\2#%\7\4\2\2$&\5\n\6"+
+               
"\2%$\3\2\2\2%&\3\2\2\2&\t\3\2\2\2\'(\7\5\2\2()\7\n\2\2)*\7\b\2\2*+\7\n"+
+               
"\2\2+,\7\6\2\2,\13\3\2\2\2-.\b\7\1\2./\5\6\4\2/8\3\2\2\2\60\61\f\3\2\2"+
+               
"\61\64\7\7\2\2\62\65\5\6\4\2\63\65\7\t\2\2\64\62\3\2\2\2\64\63\3\2\2\2"+
+               
"\65\67\3\2\2\2\66\60\3\2\2\2\67:\3\2\2\28\66\3\2\2\289\3\2\2\29\r\3\2"+
+               "\2\2:8\3\2\2\2\b\23\30\34%\648";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
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 2ab7d50..4a53da1 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
@@ -42,6 +42,17 @@ class NCMacroCompilerSpec {
     @Test
     def testCompiler(): Unit = {
         checkEq("A", Seq("A"))
+        checkEq("    A   ", Seq("A"))
         checkEq("A B", Seq("A B"))
+        checkEq("A           B", Seq("A B"))
+        checkEq("{A}", Seq("A"))
+        checkEq("{A}[0,2]", Seq("", "A", "A A"))
+        checkEq("{A  }   [0  ,2]", Seq("", "A", "A A"))
+        checkEq("{A          }", Seq("A"))
+        checkEq("      {      A          }", Seq("A"))
+        checkEq("{A}{B}", Seq("A B"))
+        checkEq(" {  A   }{B}", Seq("A B"))
+        checkEq(" {  A   }      {B}", Seq("A B"))
+        checkEq("A {B | C}", Seq("A B", "A C"))
     }
 }

Reply via email to