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

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


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

commit bb1c35af5ca07c19adeed451e8d3e7738a72d54a
Author: Aaron Radzinski <[email protected]>
AuthorDate: Sat Oct 24 23:14:08 2020 -0700

    WIP.
---
 README.md                                          |   2 +-
 .../nlpcraft/examples/alarm/alarm_model.json       |   2 +-
 .../examples/lightswitch/lightswitch_model.yaml    |   2 +-
 .../apache/nlpcraft/examples/phone/PhoneModel.java |   1 -
 .../apache/nlpcraft/examples/sql/SqlModel.scala    |  36 +-
 .../apache/nlpcraft/examples/time/TimeModel.java   |   4 +-
 .../nlpcraft/examples/weather/WeatherModel.java    |   9 +-
 .../model/intent/impl/NCIntentDslCompiler.scala    |  27 +-
 .../model/intent/impl/NCIntentSolverEngine.scala   |  11 +-
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   6 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   6 +-
 .../model/intent/impl/antlr4/NCIntentDsl.tokens    | 128 ++--
 .../impl/antlr4/NCIntentDslBaseListener.java       |  26 +-
 .../intent/impl/antlr4/NCIntentDslBaseVisitor.java | 189 -----
 .../intent/impl/antlr4/NCIntentDslLexer.interp     |   5 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java | 211 +++---
 .../intent/impl/antlr4/NCIntentDslLexer.tokens     | 128 ++--
 .../intent/impl/antlr4/NCIntentDslListener.java    |  22 +-
 .../intent/impl/antlr4/NCIntentDslParser.java      | 810 +++++++++------------
 .../intent/impl/antlr4/NCIntentDslVisitor.java     | 163 -----
 .../nlpcraft/model/intent/utils/NCDslIntent.scala  |   5 +-
 .../nlpcraft/model/intent/utils/NCDslTerm.java     |  20 +-
 .../apache/nlpcraft/model/NCIntentSampleSpec.scala |   4 +-
 .../conversation/NCConversationTimeoutSpec.scala   |   2 +-
 .../nlpcraft/model/intent/dsl/dsl_test_model.yaml  |   2 +-
 .../nlpcraft/models/stm/NCStmTestModel.scala       |   8 +-
 26 files changed, 677 insertions(+), 1152 deletions(-)

diff --git a/README.md b/README.md
index 20e7e82..177cb63 100644
--- a/README.md
+++ b/README.md
@@ -138,7 +138,7 @@ elements:
       - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
       - "no <LIGHT>"
 intents:
-  - "intent=ls conv=false term(act)={groups @@ 'act'} term(loc)={id == 
'ls:loc'}*"
+  - "intent=ls term(act)~{groups @@ 'act'} term(loc)~{id == 'ls:loc'}*"
 ```
 
 ### Model Implementation
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
index a076fa7..0e17713 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/alarm/alarm_model.json
@@ -34,6 +34,6 @@
         }
     ],
     "intents": [
-        "intent=alarm term={id=='x:alarm'} term(nums)={id=='nlpcraft:num' && 
~nlpcraft:num:unittype=='datetime' && 
~nlpcraft:num:isequalcondition==true}[0,7]"
+        "intent=alarm term~{id=='x:alarm'} term(nums)~{id=='nlpcraft:num' && 
~nlpcraft:num:unittype=='datetime' && 
~nlpcraft:num:isequalcondition==true}[0,7]"
     ]
 }
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
index 94087f4..44419c5 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
@@ -52,4 +52,4 @@ elements:
       - "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
       - "no <LIGHT>"
 intents:
-  - "intent=ls conv=false term(act)={groups @@ 'act'} term(loc)={id == 
'ls:loc'}*"
\ No newline at end of file
+  - "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
index 05c94aa..250c492 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
@@ -51,7 +51,6 @@ public class PhoneModel extends NCModelFileAdapter {
      */
     @NCIntent("" +
         "intent=action " +
-        "conv=false " + // No conversation support.
         "term={id == 'phone:act'} " +
         // Either organization, person or a phone number (or a combination of).
         "term(rcpt)={id == 'google:organization' || id == 'google:person' || 
id == 'google:phone_number'}[1,3]"
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
index 931f7ac..a837967 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
@@ -277,15 +277,15 @@ class SqlModel extends 
NCModelFileAdapter("org/apache/nlpcraft/examples/sql/sql_
       * @param limitTokOpt Limit token. Optional.
       */
     @NCIntent(
-        "intent=commonReport conv=true " +
-        "term(tbls)={groups @@ 'table'}[0,7] " +
-        "term(cols)={id == 'col:date' || id == 'col:num' || id == 
'col:varchar'}[0,7] " +
-        "term(condNums)={id == 'condition:num'}[0,7] " +
-        "term(condVals)={id == 'condition:value'}[0,7] " +
-        "term(condDates)={id == 'condition:date'}[0,7] " +
-        "term(condFreeDate)={id == 'nlpcraft:date'}? " +
-        "term(sort)={id == 'nlpcraft:sort'}? " +
-        "term(limit)={id == 'nlpcraft:limit'}?"
+        "intent=commonReport " +
+        "term(tbls)~{groups @@ 'table'}[0,7] " +
+        "term(cols)~{id == 'col:date' || id == 'col:num' || id == 
'col:varchar'}[0,7] " +
+        "term(condNums)~{id == 'condition:num'}[0,7] " +
+        "term(condVals)~{id == 'condition:value'}[0,7] " +
+        "term(condDates)~{id == 'condition:date'}[0,7] " +
+        "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
+        "term(sort)~{id == 'nlpcraft:sort'}? " +
+        "term(limit)~{id == 'nlpcraft:limit'}?"
     )
     @NCIntentSample(Array(
         "order date, please!",
@@ -339,15 +339,15 @@ class SqlModel extends 
NCModelFileAdapter("org/apache/nlpcraft/examples/sql/sql_
       * @param limitTokOpt Limit token. Optional.
       */
     @NCIntent(
-        "intent=customSortReport conv=true " +
-        "term(sort)={id == 'sort:best' || id == 'sort:worst'} " +
-        "term(tbls)={groups @@ 'table'}[0,7] " +
-        "term(cols)={id == 'col:date' || id == 'col:num' || id == 
'col:varchar'}[0,7] " +
-        "term(condNums)={id == 'condition:num'}[0,7] " +
-        "term(condVals)={id == 'condition:value'}[0,7] " +
-        "term(condDates)={id == 'condition:date'}[0,7] " +
-        "term(condFreeDate)={id == 'nlpcraft:date'}? " +
-        "term(limit)={id == 'nlpcraft:limit'}?"
+        "intent=customSortReport " +
+        "term(sort)~{id == 'sort:best' || id == 'sort:worst'} " +
+        "term(tbls)~{groups @@ 'table'}[0,7] " +
+        "term(cols)~{id == 'col:date' || id == 'col:num' || id == 
'col:varchar'}[0,7] " +
+        "term(condNums)~{id == 'condition:num'}[0,7] " +
+        "term(condVals)~{id == 'condition:value'}[0,7] " +
+        "term(condDates)~{id == 'condition:date'}[0,7] " +
+        "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
+        "term(limit)~{id == 'nlpcraft:limit'}?"
     )
     @NCIntentSample(Array(
         "What are the least performing categories for the last quarter?"
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
index 696529e..63b7090 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
@@ -92,7 +92,7 @@ public class TimeModel extends NCModelFileAdapter {
      * @param cityTok Token for 'geo' term.
      * @return Query result.
      */
-    @NCIntent("intent=intent2 conv=true term={id=='x:time'} 
term(city)={id=='nlpcraft:city'}")
+    @NCIntent("intent=intent2 term~{id=='x:time'} 
term(city)~{id=='nlpcraft:city'}")
     @NCIntentSample({
         "What time is it now in New York City?",
         "What's the current time in Moscow?",
@@ -119,7 +119,7 @@ public class TimeModel extends NCModelFileAdapter {
      * @param ctx Intent solver context.
      * @return Query result.
      */
-    @NCIntent("intent=intent1 conv=false term={id=='x:time'}")
+    @NCIntent("intent=intent1 term={id=='x:time'}")
     @NCIntentSample({
         "What's the local time?"
     })
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
index 872cb03..46dcfad 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
@@ -124,11 +124,10 @@ public class WeatherModel extends NCModelFileAdapter {
      */
     @NCIntent(
         "intent=req " +
-        "conv=true " + // Support conversation context (i.e. short term 
memory).
-        "term={id == 'wt:phen'}* " + // Zero or more weather phenomenon.
-        "term(ind)={groups @@ 'indicator'}* " + // Optional indicator words 
(zero or more).
-        "term(city)={id == 'nlpcraft:city'}? " + // Optional city.
-        "term(date)={id == 'nlpcraft:date'}?" // Optional date (overrides 
indicator words).
+        "term~{id == 'wt:phen'}* " + // Zero or more weather phenomenon.
+        "term(ind)~{groups @@ 'indicator'}* " + // Optional indicator words 
(zero or more).
+        "term(city)~{id == 'nlpcraft:city'}? " + // Optional city.
+        "term(date)~{id == 'nlpcraft:date'}?" // Optional date (overrides 
indicator words).
     )
     // NOTE: each samples group will reset conversation STM.
     @NCIntentSample({
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
index fa56ba2..edb8591 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
@@ -43,7 +43,6 @@ object NCIntentDslCompiler extends LazyLogging {
       */
     class FiniteStateMachine extends NCIntentDslBaseListener {
         // Intent components.
-        private var conv: Boolean = true
         private var ordered: Boolean = false
         private var id: String = _
         private val terms = ArrayBuffer.empty[NCDslTerm] // Accumulator for 
parsed terms.
@@ -52,6 +51,7 @@ object NCIntentDslCompiler extends LazyLogging {
     
         // Currently parsed term.
         private var termId: String = _
+        private var termConv: Boolean = _
         
         // Current min/max quantifier.
         private var min = 1
@@ -70,7 +70,7 @@ object NCIntentDslCompiler extends LazyLogging {
             require(id != null)
             require(terms.nonEmpty)
             
-            NCDslIntent(id, conv, ordered, flow.toArray, terms.toArray)
+            NCDslIntent(id, ordered, flow.toArray, terms.toArray)
         }
     
         /**
@@ -101,7 +101,11 @@ object NCIntentDslCompiler extends LazyLogging {
         override def exitTermId(ctx: NCIntentDslParser.TermIdContext): Unit = {
             termId = ctx.ID().getText
         }
-    
+
+        override def exitTermEq(ctx: NCIntentDslParser.TermEqContext): Unit = {
+            termConv = ctx.TILDA() != null
+        }
+
         override def exitMinMaxRange(ctx: 
NCIntentDslParser.MinMaxRangeContext): Unit = {
             val minStr = ctx.getChild(1).getText
             val maxStr = ctx.getChild(3).getText
@@ -118,10 +122,6 @@ object NCIntentDslCompiler extends LazyLogging {
             id = ctx.ID().getText
         }
     
-        override def exitConvDecl(ctx: NCIntentDslParser.ConvDeclContext): 
Unit = {
-            conv = ctx.BOOL().getText == "true"
-        }
-    
         override def exitOrderedDecl(ctx: 
NCIntentDslParser.OrderedDeclContext): Unit = {
             ordered = ctx.BOOL().getText == "true"
         }
@@ -131,10 +131,15 @@ object NCIntentDslCompiler extends LazyLogging {
             
             val p = predStack.pop
             
-            terms += new NCDslTerm(termId, new 
java.util.function.Function[NCToken, java.lang.Boolean]() {
-                override def apply(tok: NCToken): java.lang.Boolean = 
p.apply(tok)
-                override def toString: String = p.toString() 
//ctx.item().getText
-            }, min, max)
+            terms += new NCDslTerm(
+                termId,
+                new java.util.function.Function[NCToken, java.lang.Boolean]() {
+                    override def apply(tok: NCToken): java.lang.Boolean = 
p.apply(tok)
+                    override def toString: String = p.toString() 
//ctx.item().getText
+                },
+                min,
+                max,
+                termConv)
             
             // Reset.
             termId = null
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
index e42c92c..db41dd0 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
@@ -114,7 +114,6 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
         usedTokens: List[UsedToken],
         weight: Weight
     ) {
-        lazy val minIndex: Int = usedTokens.minBy(_.token.index).token.index
         lazy val maxIndex: Int = usedTokens.maxBy(_.token.index).token.index
     }
 
@@ -163,7 +162,6 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
             variantIdx: Int // Variant index.
         )
         val req = ctx.getRequest
-        val conv = ctx.getConversation.getTokens
 
         startScopedSpan("solve",
             "srvReqId" → req.getServerRequestId,
@@ -187,17 +185,17 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
 
                         // Isolated conversation tokens.
                         val convToks =
-                            if (intent.conv)
+                            if (intent.terms.exists(_.isConversational))
                                 Seq.empty[UsedToken] ++
                                     // We shouldn't mix tokens with same group 
from conversation
                                     // history and processed sentence.
-                                    conv.
+                                    ctx.getConversation.getTokens.
                                         filter(t ⇒ {
                                             val convTokGroups = 
t.getGroups.sorted
 
                                             
!senTokGroups.exists(convTokGroups.containsSlice)
                                         }).
-                                        map(UsedToken(false, true, _))
+                                        map(UsedToken(used = false, conv = 
true, _))
                             else
                                 Seq.empty[UsedToken]
 
@@ -418,7 +416,7 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
                 solveTerm(
                     term,
                     senToks,
-                    convToks
+                    if (term.isConversational) convToks else Seq.empty
                 ) match {
                     case Some(termMatch) ⇒
                         if (ordered && lastTermMatch != null && 
lastTermMatch.maxIndex > termMatch.maxIndex)
@@ -511,6 +509,7 @@ object NCIntentSolverEngine extends LazyLogging with 
NCOpenCensusTrace {
                 termWeight ++= t._2
     
                 Some(TermMatch(term.getId, termToks, termWeight))
+
             case None ⇒
                 None
         }
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 5486689..b3025c4 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
@@ -17,9 +17,8 @@
 
 grammar NCIntentDsl;
 
-intent: intentId convDecl? orderedDecl? flowDecl? terms EOF;
+intent: intentId orderedDecl? flowDecl? terms EOF;
 intentId: 'intent' EQ ID;
-convDecl: 'conv' EQ BOOL;
 orderedDecl: 'ordered' EQ BOOL;
 flowDecl: 'flow' EQ SQUOTE flow SQUOTE;
 flow
@@ -37,7 +36,8 @@ idList
     | idList VERT ID
     ;
 terms: term | terms term;
-term: 'term' termId? EQ LCURLY item RCURLY minMax?;
+termEq: EQ | TILDA;
+term: 'term' termId? termEq LCURLY item RCURLY minMax?;
 termId: LPAREN ID RPAREN;
 item
     : predicate
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 6ea233e..40e4f1c 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
@@ -1,7 +1,6 @@
 token literal names:
 null
 'intent'
-'conv'
 'ordered'
 'flow'
 'term'
@@ -59,7 +58,6 @@ null
 null
 null
 null
-null
 PRED_OP
 AND
 OR
@@ -93,7 +91,6 @@ ErrorCharacter
 rule names:
 intent
 intentId
-convDecl
 orderedDecl
 flowDecl
 flow
@@ -101,6 +98,7 @@ flowItem
 flowItemIds
 idList
 terms
+termEq
 term
 termId
 item
@@ -119,4 +117,4 @@ minMaxRange
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 45, 268, 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, 4, 26, 9, 26, 3, 2, 3, 2, 5, 2, 55, 10, 2, 3, 2, 5, 2, 58, 10, 2, 3, 2, 5, 
2, 61, 10, 2, 3, 2, 3, 2, [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 44, 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, 4, 26, 9, 26, 3, 2, 3, 2, 5, 2, 55, 10, 2, 3, 2, 5, 2, 58, 10, 2, 3, 2, 3, 
2, 3, 2, 3, 3, 3, 3, 3, 3 [...]
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
index 8ae22bf..e2c3312 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
@@ -11,69 +11,67 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-T__13=14
-PRED_OP=15
-AND=16
-OR=17
-VERT=18
-EXCL=19
-LPAREN=20
-RPAREN=21
-LCURLY=22
-RCURLY=23
-SQUOTE=24
-TILDA=25
-RIGHT=26
-LBR=27
-RBR=28
-COMMA=29
-COLON=30
-MINUS=31
-DOT=32
-UNDERSCORE=33
-EQ=34
-PLUS=35
-QUESTION=36
-STAR=37
-BOOL=38
-INT=39
-EXP=40
-ID=41
-WS=42
-ErrorCharacter=43
+PRED_OP=14
+AND=15
+OR=16
+VERT=17
+EXCL=18
+LPAREN=19
+RPAREN=20
+LCURLY=21
+RCURLY=22
+SQUOTE=23
+TILDA=24
+RIGHT=25
+LBR=26
+RBR=27
+COMMA=28
+COLON=29
+MINUS=30
+DOT=31
+UNDERSCORE=32
+EQ=33
+PLUS=34
+QUESTION=35
+STAR=36
+BOOL=37
+INT=38
+EXP=39
+ID=40
+WS=41
+ErrorCharacter=42
 'intent'=1
-'conv'=2
-'ordered'=3
-'flow'=4
-'term'=5
-'id'=6
-'aliases'=7
-'startidx'=8
-'endidx'=9
-'parent'=10
-'groups'=11
-'ancestors'=12
-'value'=13
-'null'=14
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
+'ordered'=2
+'flow'=3
+'term'=4
+'id'=5
+'aliases'=6
+'startidx'=7
+'endidx'=8
+'parent'=9
+'groups'=10
+'ancestors'=11
+'value'=12
+'null'=13
+'&&'=15
+'||'=16
+'|'=17
+'!'=18
+'('=19
+')'=20
+'{'=21
+'}'=22
+'\''=23
+'~'=24
+'>>'=25
+'['=26
+']'=27
+','=28
+':'=29
+'-'=30
+'.'=31
+'_'=32
+'='=33
+'+'=34
+'?'=35
+'*'=36
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 14bfb7d..32fdf9c 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/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
+// 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.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
@@ -40,18 +40,6 @@ public class NCIntentDslBaseListener implements 
NCIntentDslListener {
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterConvDecl(NCIntentDslParser.ConvDeclContext 
ctx) { }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation does nothing.</p>
-        */
-       @Override public void exitConvDecl(NCIntentDslParser.ConvDeclContext 
ctx) { }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation does nothing.</p>
-        */
        @Override public void 
enterOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx) { }
        /**
         * {@inheritDoc}
@@ -136,6 +124,18 @@ public class NCIntentDslBaseListener implements 
NCIntentDslListener {
         *
         * <p>The default implementation does nothing.</p>
         */
+       @Override public void enterTermEq(NCIntentDslParser.TermEqContext ctx) 
{ }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitTermEq(NCIntentDslParser.TermEqContext ctx) { 
}
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
        @Override public void enterTerm(NCIntentDslParser.TermContext ctx) { }
        /**
         * {@inheritDoc}
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java
deleted file mode 100644
index 5865db4..0000000
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseVisitor.java
+++ /dev/null
@@ -1,189 +0,0 @@
-// Generated from 
/Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
-package org.apache.nlpcraft.model.intent.impl.antlr4;
-import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
-
-/**
- * This class provides an empty implementation of {@link NCIntentDslVisitor},
- * which can be extended to create a visitor which only needs to handle a 
subset
- * of the available methods.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public class NCIntentDslBaseVisitor<T> extends AbstractParseTreeVisitor<T> 
implements NCIntentDslVisitor<T> {
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitIntent(NCIntentDslParser.IntentContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitIntentId(NCIntentDslParser.IntentIdContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitConvDecl(NCIntentDslParser.ConvDeclContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T 
visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx) { return 
visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitFlow(NCIntentDslParser.FlowContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitFlowItem(NCIntentDslParser.FlowItemContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T 
visitFlowItemIds(NCIntentDslParser.FlowItemIdsContext ctx) { return 
visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitIdList(NCIntentDslParser.IdListContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitTerms(NCIntentDslParser.TermsContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitTerm(NCIntentDslParser.TermContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitTermId(NCIntentDslParser.TermIdContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitItem(NCIntentDslParser.ItemContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitPredicate(NCIntentDslParser.PredicateContext 
ctx) { return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitLval(NCIntentDslParser.LvalContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitLvalQual(NCIntentDslParser.LvalQualContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitLvalPart(NCIntentDslParser.LvalPartContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitRvalSingle(NCIntentDslParser.RvalSingleContext 
ctx) { return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitRval(NCIntentDslParser.RvalContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitRvalList(NCIntentDslParser.RvalListContext ctx) 
{ return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitMeta(NCIntentDslParser.MetaContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitQstring(NCIntentDslParser.QstringContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T visitMinMax(NCIntentDslParser.MinMaxContext ctx) { 
return visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T 
visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx) { return 
visitChildren(ctx); }
-       /**
-        * {@inheritDoc}
-        *
-        * <p>The default implementation returns the result of calling
-        * {@link #visitChildren} on {@code ctx}.</p>
-        */
-       @Override public T 
visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx) { return 
visitChildren(ctx); }
-}
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
index fcb2a0c..4fb76df 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
@@ -1,7 +1,6 @@
 token literal names:
 null
 'intent'
-'conv'
 'ordered'
 'flow'
 'term'
@@ -59,7 +58,6 @@ null
 null
 null
 null
-null
 PRED_OP
 AND
 OR
@@ -104,7 +102,6 @@ T__9
 T__10
 T__11
 T__12
-T__13
 PRED_OP
 AND
 OR
@@ -143,4 +140,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 45, 294, 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, 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, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 44, 287, 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, 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, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
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 1f458a1..a7c7c26 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,10 +1,13 @@
-// Generated from 
/Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
+// 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.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
 import org.antlr.v4.runtime.*;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslLexer extends Lexer {
@@ -15,11 +18,11 @@ public class NCIntentDslLexer extends Lexer {
                new PredictionContextCache();
        public static final int
                T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, 
T__8=9, 
-               T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, PRED_OP=15, 
AND=16, OR=17, 
-               VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, 
SQUOTE=24, 
-               TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, 
MINUS=31, DOT=32, 
-               UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, BOOL=38, 
INT=39, 
-               EXP=40, ID=41, WS=42, ErrorCharacter=43;
+               T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, 
OR=16, VERT=17, 
+               EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, 
TILDA=24, 
+               RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, 
UNDERSCORE=32, 
+               EQ=33, PLUS=34, QUESTION=35, STAR=36, BOOL=37, INT=38, EXP=39, 
ID=40, 
+               WS=41, ErrorCharacter=42;
        public static String[] channelNames = {
                "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
        };
@@ -31,9 +34,9 @@ public class NCIntentDslLexer extends Lexer {
        private static String[] makeRuleNames() {
                return new String[] {
                        "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", 
"T__7", "T__8", 
-                       "T__9", "T__10", "T__11", "T__12", "T__13", "PRED_OP", 
"AND", "OR", "VERT", 
-                       "EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", 
"SQUOTE", "TILDA", "RIGHT", 
-                       "LBR", "RBR", "COMMA", "COLON", "MINUS", "DOT", 
"UNDERSCORE", "EQ", "PLUS", 
+                       "T__9", "T__10", "T__11", "T__12", "PRED_OP", "AND", 
"OR", "VERT", "EXCL", 
+                       "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", 
"TILDA", "RIGHT", "LBR", 
+                       "RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", 
"EQ", "PLUS", 
                        "QUESTION", "STAR", "BOOL", "INT", "EXP", "ID", "WS", 
"ErrorCharacter"
                };
        }
@@ -41,18 +44,18 @@ public class NCIntentDslLexer extends Lexer {
 
        private static String[] makeLiteralNames() {
                return new String[] {
-                       null, "'intent'", "'conv'", "'ordered'", "'flow'", 
"'term'", "'id'", 
-                       "'aliases'", "'startidx'", "'endidx'", "'parent'", 
"'groups'", "'ancestors'", 
-                       "'value'", "'null'", null, "'&&'", "'||'", "'|'", 
"'!'", "'('", "')'", 
-                       "'{'", "'}'", "'''", "'~'", "'>>'", "'['", "']'", 
"','", "':'", "'-'", 
-                       "'.'", "'_'", "'='", "'+'", "'?'", "'*'"
+                       null, "'intent'", "'ordered'", "'flow'", "'term'", 
"'id'", "'aliases'", 
+                       "'startidx'", "'endidx'", "'parent'", "'groups'", 
"'ancestors'", "'value'", 
+                       "'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", 
"')'", "'{'", "'}'", 
+                       "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", 
"'-'", "'.'", "'_'", 
+                       "'='", "'+'", "'?'", "'*'"
                };
        }
        private static final String[] _LITERAL_NAMES = makeLiteralNames();
        private static String[] makeSymbolicNames() {
                return new String[] {
                        null, null, null, null, null, null, null, null, null, 
null, null, null, 
-                       null, null, null, "PRED_OP", "AND", "OR", "VERT", 
"EXCL", "LPAREN", "RPAREN", 
+                       null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", 
"LPAREN", "RPAREN", 
                        "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", 
"RBR", "COMMA", 
                        "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", 
"QUESTION", "STAR", 
                        "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
@@ -117,100 +120,98 @@ public class NCIntentDslLexer extends Lexer {
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2-\u0126\b\1\4\2\t"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2,\u011f\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\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"+
                "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 
\t \4!"+
-               
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
-               
",\t,\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+
-               
"\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\b"+
-               
"\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+
-               
"\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f"+
-               
"\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+
-               
"\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20"+
-               
"\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00c3\n\20\3\21\3\21\3\21\3\22"+
-               
"\3\22\3\22\3\23\3\23\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30"+
-               
"\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37"+
-               "\3\37\3 \3 
\3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'\3\'\3\'\3\'\3\'"+
-               
"\3\'\3\'\3\'\3\'\5\'\u00fd\n\'\3(\3(\3(\7(\u0102\n(\f(\16(\u0105\13(\5"+
-               
"(\u0107\n(\3)\3)\6)\u010b\n)\r)\16)\u010c\3*\3*\6*\u0111\n*\r*\16*\u0112"+
-               
"\3*\3*\3*\3*\7*\u0119\n*\f*\16*\u011c\13*\3+\6+\u011f\n+\r+\16+\u0120"+
-               
"\3+\3+\3,\3,\2\2-\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
-               
"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65"+
-               "\34\67\359\36;\37= 
?!A\"C#E$G%I&K\'M(O)Q*S+U,W-\3\2\t\4\2>>@@\3\2\63;"+
-               
"\4\2\62;aa\3\2\62;\4\2C\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u0136\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\21\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\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2"+
-               
"\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2"+
-               
"\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2"+
-               
"\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2"+
-               
"\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U"+
-               
"\3\2\2\2\2W\3\2\2\2\3Y\3\2\2\2\5`\3\2\2\2\7e\3\2\2\2\tm\3\2\2\2\13r\3"+
-               
"\2\2\2\rw\3\2\2\2\17z\3\2\2\2\21\u0082\3\2\2\2\23\u008b\3\2\2\2\25\u0092"+
-               
"\3\2\2\2\27\u0099\3\2\2\2\31\u00a0\3\2\2\2\33\u00aa\3\2\2\2\35\u00b0\3"+
-               
"\2\2\2\37\u00c2\3\2\2\2!\u00c4\3\2\2\2#\u00c7\3\2\2\2%\u00ca\3\2\2\2\'"+
-               
"\u00cc\3\2\2\2)\u00ce\3\2\2\2+\u00d0\3\2\2\2-\u00d2\3\2\2\2/\u00d4\3\2"+
-               
"\2\2\61\u00d6\3\2\2\2\63\u00d8\3\2\2\2\65\u00da\3\2\2\2\67\u00dd\3\2\2"+
-               
"\29\u00df\3\2\2\2;\u00e1\3\2\2\2=\u00e3\3\2\2\2?\u00e5\3\2\2\2A\u00e7"+
-               
"\3\2\2\2C\u00e9\3\2\2\2E\u00eb\3\2\2\2G\u00ed\3\2\2\2I\u00ef\3\2\2\2K"+
-               
"\u00f1\3\2\2\2M\u00fc\3\2\2\2O\u0106\3\2\2\2Q\u0108\3\2\2\2S\u0110\3\2"+
-               
"\2\2U\u011e\3\2\2\2W\u0124\3\2\2\2YZ\7k\2\2Z[\7p\2\2[\\\7v\2\2\\]\7g\2"+
-               
"\2]^\7p\2\2^_\7v\2\2_\4\3\2\2\2`a\7e\2\2ab\7q\2\2bc\7p\2\2cd\7x\2\2d\6"+
-               
"\3\2\2\2ef\7q\2\2fg\7t\2\2gh\7f\2\2hi\7g\2\2ij\7t\2\2jk\7g\2\2kl\7f\2"+
-               
"\2l\b\3\2\2\2mn\7h\2\2no\7n\2\2op\7q\2\2pq\7y\2\2q\n\3\2\2\2rs\7v\2\2"+
-               
"st\7g\2\2tu\7t\2\2uv\7o\2\2v\f\3\2\2\2wx\7k\2\2xy\7f\2\2y\16\3\2\2\2z"+
-               
"{\7c\2\2{|\7n\2\2|}\7k\2\2}~\7c\2\2~\177\7u\2\2\177\u0080\7g\2\2\u0080"+
-               
"\u0081\7u\2\2\u0081\20\3\2\2\2\u0082\u0083\7u\2\2\u0083\u0084\7v\2\2\u0084"+
-               
"\u0085\7c\2\2\u0085\u0086\7t\2\2\u0086\u0087\7v\2\2\u0087\u0088\7k\2\2"+
-               
"\u0088\u0089\7f\2\2\u0089\u008a\7z\2\2\u008a\22\3\2\2\2\u008b\u008c\7"+
-               
"g\2\2\u008c\u008d\7p\2\2\u008d\u008e\7f\2\2\u008e\u008f\7k\2\2\u008f\u0090"+
-               
"\7f\2\2\u0090\u0091\7z\2\2\u0091\24\3\2\2\2\u0092\u0093\7r\2\2\u0093\u0094"+
-               
"\7c\2\2\u0094\u0095\7t\2\2\u0095\u0096\7g\2\2\u0096\u0097\7p\2\2\u0097"+
-               
"\u0098\7v\2\2\u0098\26\3\2\2\2\u0099\u009a\7i\2\2\u009a\u009b\7t\2\2\u009b"+
-               
"\u009c\7q\2\2\u009c\u009d\7w\2\2\u009d\u009e\7r\2\2\u009e\u009f\7u\2\2"+
-               
"\u009f\30\3\2\2\2\u00a0\u00a1\7c\2\2\u00a1\u00a2\7p\2\2\u00a2\u00a3\7"+
-               
"e\2\2\u00a3\u00a4\7g\2\2\u00a4\u00a5\7u\2\2\u00a5\u00a6\7v\2\2\u00a6\u00a7"+
-               
"\7q\2\2\u00a7\u00a8\7t\2\2\u00a8\u00a9\7u\2\2\u00a9\32\3\2\2\2\u00aa\u00ab"+
-               
"\7x\2\2\u00ab\u00ac\7c\2\2\u00ac\u00ad\7n\2\2\u00ad\u00ae\7w\2\2\u00ae"+
-               
"\u00af\7g\2\2\u00af\34\3\2\2\2\u00b0\u00b1\7p\2\2\u00b1\u00b2\7w\2\2\u00b2"+
-               
"\u00b3\7n\2\2\u00b3\u00b4\7n\2\2\u00b4\36\3\2\2\2\u00b5\u00b6\7?\2\2\u00b6"+
-               
"\u00c3\7?\2\2\u00b7\u00b8\7#\2\2\u00b8\u00c3\7?\2\2\u00b9\u00ba\7@\2\2"+
-               
"\u00ba\u00c3\7?\2\2\u00bb\u00bc\7>\2\2\u00bc\u00c3\7?\2\2\u00bd\u00c3"+
-               
"\t\2\2\2\u00be\u00bf\7B\2\2\u00bf\u00c3\7B\2\2\u00c0\u00c1\7#\2\2\u00c1"+
-               
"\u00c3\7B\2\2\u00c2\u00b5\3\2\2\2\u00c2\u00b7\3\2\2\2\u00c2\u00b9\3\2"+
-               
"\2\2\u00c2\u00bb\3\2\2\2\u00c2\u00bd\3\2\2\2\u00c2\u00be\3\2\2\2\u00c2"+
-               "\u00c0\3\2\2\2\u00c3 
\3\2\2\2\u00c4\u00c5\7(\2\2\u00c5\u00c6\7(\2\2\u00c6"+
-               
"\"\3\2\2\2\u00c7\u00c8\7~\2\2\u00c8\u00c9\7~\2\2\u00c9$\3\2\2\2\u00ca"+
-               
"\u00cb\7~\2\2\u00cb&\3\2\2\2\u00cc\u00cd\7#\2\2\u00cd(\3\2\2\2\u00ce\u00cf"+
-               
"\7*\2\2\u00cf*\3\2\2\2\u00d0\u00d1\7+\2\2\u00d1,\3\2\2\2\u00d2\u00d3\7"+
-               
"}\2\2\u00d3.\3\2\2\2\u00d4\u00d5\7\177\2\2\u00d5\60\3\2\2\2\u00d6\u00d7"+
-               
"\7)\2\2\u00d7\62\3\2\2\2\u00d8\u00d9\7\u0080\2\2\u00d9\64\3\2\2\2\u00da"+
-               
"\u00db\7@\2\2\u00db\u00dc\7@\2\2\u00dc\66\3\2\2\2\u00dd\u00de\7]\2\2\u00de"+
-               
"8\3\2\2\2\u00df\u00e0\7_\2\2\u00e0:\3\2\2\2\u00e1\u00e2\7.\2\2\u00e2<"+
-               
"\3\2\2\2\u00e3\u00e4\7<\2\2\u00e4>\3\2\2\2\u00e5\u00e6\7/\2\2\u00e6@\3"+
-               
"\2\2\2\u00e7\u00e8\7\60\2\2\u00e8B\3\2\2\2\u00e9\u00ea\7a\2\2\u00eaD\3"+
-               
"\2\2\2\u00eb\u00ec\7?\2\2\u00ecF\3\2\2\2\u00ed\u00ee\7-\2\2\u00eeH\3\2"+
-               
"\2\2\u00ef\u00f0\7A\2\2\u00f0J\3\2\2\2\u00f1\u00f2\7,\2\2\u00f2L\3\2\2"+
-               
"\2\u00f3\u00f4\7v\2\2\u00f4\u00f5\7t\2\2\u00f5\u00f6\7w\2\2\u00f6\u00fd"+
-               
"\7g\2\2\u00f7\u00f8\7h\2\2\u00f8\u00f9\7c\2\2\u00f9\u00fa\7n\2\2\u00fa"+
-               
"\u00fb\7u\2\2\u00fb\u00fd\7g\2\2\u00fc\u00f3\3\2\2\2\u00fc\u00f7\3\2\2"+
-               
"\2\u00fdN\3\2\2\2\u00fe\u0107\7\62\2\2\u00ff\u0103\t\3\2\2\u0100\u0102"+
-               
"\t\4\2\2\u0101\u0100\3\2\2\2\u0102\u0105\3\2\2\2\u0103\u0101\3\2\2\2\u0103"+
-               
"\u0104\3\2\2\2\u0104\u0107\3\2\2\2\u0105\u0103\3\2\2\2\u0106\u00fe\3\2"+
-               
"\2\2\u0106\u00ff\3\2\2\2\u0107P\3\2\2\2\u0108\u010a\5A!\2\u0109\u010b"+
-               
"\t\5\2\2\u010a\u0109\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010a\3\2\2\2\u010c"+
-               
"\u010d\3\2\2\2\u010dR\3\2\2\2\u010e\u0111\5C\"\2\u010f\u0111\t\6\2\2\u0110"+
-               
"\u010e\3\2\2\2\u0110\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0110\3\2"+
-               
"\2\2\u0112\u0113\3\2\2\2\u0113\u011a\3\2\2\2\u0114\u0119\t\7\2\2\u0115"+
-               "\u0119\5=\37\2\u0116\u0119\5? 
\2\u0117\u0119\5C\"\2\u0118\u0114\3\2\2"+
-               
"\2\u0118\u0115\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0117\3\2\2\2\u0119\u011c"+
-               
"\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011bT\3\2\2\2\u011c"+
-               
"\u011a\3\2\2\2\u011d\u011f\t\b\2\2\u011e\u011d\3\2\2\2\u011f\u0120\3\2"+
-               
"\2\2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0122\3\2\2\2\u0122"+
-               
"\u0123\b+\2\2\u0123V\3\2\2\2\u0124\u0125\13\2\2\2\u0125X\3\2\2\2\r\2\u00c2"+
-               
"\u00fc\u0103\u0106\u010c\u0110\u0112\u0118\u011a\u0120\3\b\2\2";
+               
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\3"+
+               
"\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4"+
+               
"\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3"+
+               
"\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n"+
+               
"\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3"+
+               
"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16"+
+               
"\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
+               
"\3\17\5\17\u00bc\n\17\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22\3\23\3\23"+
+               
"\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32"+
+               "\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 
\3!\3!\3"+
+               
"\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u00f6\n&\3\'\3"+
+               
"\'\3\'\7\'\u00fb\n\'\f\'\16\'\u00fe\13\'\5\'\u0100\n\'\3(\3(\6(\u0104"+
+               
"\n(\r(\16(\u0105\3)\3)\6)\u010a\n)\r)\16)\u010b\3)\3)\3)\3)\7)\u0112\n"+
+               
")\f)\16)\u0115\13)\3*\6*\u0118\n*\r*\16*\u0119\3*\3*\3+\3+\2\2,\3\3\5"+
+               
"\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21"+
+               
"!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!"+
+               
"A\"C#E$G%I&K\'M(O)Q*S+U,\3\2\t\4\2>>@@\3\2\63;\4\2\62;aa\3\2\62;\4\2C"+
+               
"\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u012f\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\21\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\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
+               
"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
+               
"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
+               
"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
+               
"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\3W\3\2\2\2\5^\3"+
+               
"\2\2\2\7f\3\2\2\2\tk\3\2\2\2\13p\3\2\2\2\rs\3\2\2\2\17{\3\2\2\2\21\u0084"+
+               
"\3\2\2\2\23\u008b\3\2\2\2\25\u0092\3\2\2\2\27\u0099\3\2\2\2\31\u00a3\3"+
+               
"\2\2\2\33\u00a9\3\2\2\2\35\u00bb\3\2\2\2\37\u00bd\3\2\2\2!\u00c0\3\2\2"+
+               
"\2#\u00c3\3\2\2\2%\u00c5\3\2\2\2\'\u00c7\3\2\2\2)\u00c9\3\2\2\2+\u00cb"+
+               
"\3\2\2\2-\u00cd\3\2\2\2/\u00cf\3\2\2\2\61\u00d1\3\2\2\2\63\u00d3\3\2\2"+
+               
"\2\65\u00d6\3\2\2\2\67\u00d8\3\2\2\29\u00da\3\2\2\2;\u00dc\3\2\2\2=\u00de"+
+               
"\3\2\2\2?\u00e0\3\2\2\2A\u00e2\3\2\2\2C\u00e4\3\2\2\2E\u00e6\3\2\2\2G"+
+               
"\u00e8\3\2\2\2I\u00ea\3\2\2\2K\u00f5\3\2\2\2M\u00ff\3\2\2\2O\u0101\3\2"+
+               
"\2\2Q\u0109\3\2\2\2S\u0117\3\2\2\2U\u011d\3\2\2\2WX\7k\2\2XY\7p\2\2YZ"+
+               
"\7v\2\2Z[\7g\2\2[\\\7p\2\2\\]\7v\2\2]\4\3\2\2\2^_\7q\2\2_`\7t\2\2`a\7"+
+               
"f\2\2ab\7g\2\2bc\7t\2\2cd\7g\2\2de\7f\2\2e\6\3\2\2\2fg\7h\2\2gh\7n\2\2"+
+               
"hi\7q\2\2ij\7y\2\2j\b\3\2\2\2kl\7v\2\2lm\7g\2\2mn\7t\2\2no\7o\2\2o\n\3"+
+               
"\2\2\2pq\7k\2\2qr\7f\2\2r\f\3\2\2\2st\7c\2\2tu\7n\2\2uv\7k\2\2vw\7c\2"+
+               
"\2wx\7u\2\2xy\7g\2\2yz\7u\2\2z\16\3\2\2\2{|\7u\2\2|}\7v\2\2}~\7c\2\2~"+
+               
"\177\7t\2\2\177\u0080\7v\2\2\u0080\u0081\7k\2\2\u0081\u0082\7f\2\2\u0082"+
+               
"\u0083\7z\2\2\u0083\20\3\2\2\2\u0084\u0085\7g\2\2\u0085\u0086\7p\2\2\u0086"+
+               
"\u0087\7f\2\2\u0087\u0088\7k\2\2\u0088\u0089\7f\2\2\u0089\u008a\7z\2\2"+
+               
"\u008a\22\3\2\2\2\u008b\u008c\7r\2\2\u008c\u008d\7c\2\2\u008d\u008e\7"+
+               
"t\2\2\u008e\u008f\7g\2\2\u008f\u0090\7p\2\2\u0090\u0091\7v\2\2\u0091\24"+
+               
"\3\2\2\2\u0092\u0093\7i\2\2\u0093\u0094\7t\2\2\u0094\u0095\7q\2\2\u0095"+
+               
"\u0096\7w\2\2\u0096\u0097\7r\2\2\u0097\u0098\7u\2\2\u0098\26\3\2\2\2\u0099"+
+               
"\u009a\7c\2\2\u009a\u009b\7p\2\2\u009b\u009c\7e\2\2\u009c\u009d\7g\2\2"+
+               
"\u009d\u009e\7u\2\2\u009e\u009f\7v\2\2\u009f\u00a0\7q\2\2\u00a0\u00a1"+
+               
"\7t\2\2\u00a1\u00a2\7u\2\2\u00a2\30\3\2\2\2\u00a3\u00a4\7x\2\2\u00a4\u00a5"+
+               
"\7c\2\2\u00a5\u00a6\7n\2\2\u00a6\u00a7\7w\2\2\u00a7\u00a8\7g\2\2\u00a8"+
+               
"\32\3\2\2\2\u00a9\u00aa\7p\2\2\u00aa\u00ab\7w\2\2\u00ab\u00ac\7n\2\2\u00ac"+
+               
"\u00ad\7n\2\2\u00ad\34\3\2\2\2\u00ae\u00af\7?\2\2\u00af\u00bc\7?\2\2\u00b0"+
+               
"\u00b1\7#\2\2\u00b1\u00bc\7?\2\2\u00b2\u00b3\7@\2\2\u00b3\u00bc\7?\2\2"+
+               
"\u00b4\u00b5\7>\2\2\u00b5\u00bc\7?\2\2\u00b6\u00bc\t\2\2\2\u00b7\u00b8"+
+               
"\7B\2\2\u00b8\u00bc\7B\2\2\u00b9\u00ba\7#\2\2\u00ba\u00bc\7B\2\2\u00bb"+
+               
"\u00ae\3\2\2\2\u00bb\u00b0\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bb\u00b4\3\2"+
+               
"\2\2\u00bb\u00b6\3\2\2\2\u00bb\u00b7\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bc"+
+               "\36\3\2\2\2\u00bd\u00be\7(\2\2\u00be\u00bf\7(\2\2\u00bf 
\3\2\2\2\u00c0"+
+               
"\u00c1\7~\2\2\u00c1\u00c2\7~\2\2\u00c2\"\3\2\2\2\u00c3\u00c4\7~\2\2\u00c4"+
+               
"$\3\2\2\2\u00c5\u00c6\7#\2\2\u00c6&\3\2\2\2\u00c7\u00c8\7*\2\2\u00c8("+
+               
"\3\2\2\2\u00c9\u00ca\7+\2\2\u00ca*\3\2\2\2\u00cb\u00cc\7}\2\2\u00cc,\3"+
+               
"\2\2\2\u00cd\u00ce\7\177\2\2\u00ce.\3\2\2\2\u00cf\u00d0\7)\2\2\u00d0\60"+
+               
"\3\2\2\2\u00d1\u00d2\7\u0080\2\2\u00d2\62\3\2\2\2\u00d3\u00d4\7@\2\2\u00d4"+
+               
"\u00d5\7@\2\2\u00d5\64\3\2\2\2\u00d6\u00d7\7]\2\2\u00d7\66\3\2\2\2\u00d8"+
+               
"\u00d9\7_\2\2\u00d98\3\2\2\2\u00da\u00db\7.\2\2\u00db:\3\2\2\2\u00dc\u00dd"+
+               
"\7<\2\2\u00dd<\3\2\2\2\u00de\u00df\7/\2\2\u00df>\3\2\2\2\u00e0\u00e1\7"+
+               
"\60\2\2\u00e1@\3\2\2\2\u00e2\u00e3\7a\2\2\u00e3B\3\2\2\2\u00e4\u00e5\7"+
+               
"?\2\2\u00e5D\3\2\2\2\u00e6\u00e7\7-\2\2\u00e7F\3\2\2\2\u00e8\u00e9\7A"+
+               
"\2\2\u00e9H\3\2\2\2\u00ea\u00eb\7,\2\2\u00ebJ\3\2\2\2\u00ec\u00ed\7v\2"+
+               
"\2\u00ed\u00ee\7t\2\2\u00ee\u00ef\7w\2\2\u00ef\u00f6\7g\2\2\u00f0\u00f1"+
+               
"\7h\2\2\u00f1\u00f2\7c\2\2\u00f2\u00f3\7n\2\2\u00f3\u00f4\7u\2\2\u00f4"+
+               
"\u00f6\7g\2\2\u00f5\u00ec\3\2\2\2\u00f5\u00f0\3\2\2\2\u00f6L\3\2\2\2\u00f7"+
+               
"\u0100\7\62\2\2\u00f8\u00fc\t\3\2\2\u00f9\u00fb\t\4\2\2\u00fa\u00f9\3"+
+               
"\2\2\2\u00fb\u00fe\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd"+
+               
"\u0100\3\2\2\2\u00fe\u00fc\3\2\2\2\u00ff\u00f7\3\2\2\2\u00ff\u00f8\3\2"+
+               "\2\2\u0100N\3\2\2\2\u0101\u0103\5? 
\2\u0102\u0104\t\5\2\2\u0103\u0102"+
+               
"\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0103\3\2\2\2\u0105\u0106\3\2\2\2\u0106"+
+               
"P\3\2\2\2\u0107\u010a\5A!\2\u0108\u010a\t\6\2\2\u0109\u0107\3\2\2\2\u0109"+
+               
"\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u0109\3\2\2\2\u010b\u010c\3\2"+
+               
"\2\2\u010c\u0113\3\2\2\2\u010d\u0112\t\7\2\2\u010e\u0112\5;\36\2\u010f"+
+               
"\u0112\5=\37\2\u0110\u0112\5A!\2\u0111\u010d\3\2\2\2\u0111\u010e\3\2\2"+
+               
"\2\u0111\u010f\3\2\2\2\u0111\u0110\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0111"+
+               
"\3\2\2\2\u0113\u0114\3\2\2\2\u0114R\3\2\2\2\u0115\u0113\3\2\2\2\u0116"+
+               
"\u0118\t\b\2\2\u0117\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u0117\3\2"+
+               
"\2\2\u0119\u011a\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011c\b*\2\2\u011c"+
+               
"T\3\2\2\2\u011d\u011e\13\2\2\2\u011eV\3\2\2\2\r\2\u00bb\u00f5\u00fc\u00ff"+
+               "\u0105\u0109\u010b\u0111\u0113\u0119\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/model/intent/impl/antlr4/NCIntentDslLexer.tokens
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
index 8ae22bf..e2c3312 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
@@ -11,69 +11,67 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-T__13=14
-PRED_OP=15
-AND=16
-OR=17
-VERT=18
-EXCL=19
-LPAREN=20
-RPAREN=21
-LCURLY=22
-RCURLY=23
-SQUOTE=24
-TILDA=25
-RIGHT=26
-LBR=27
-RBR=28
-COMMA=29
-COLON=30
-MINUS=31
-DOT=32
-UNDERSCORE=33
-EQ=34
-PLUS=35
-QUESTION=36
-STAR=37
-BOOL=38
-INT=39
-EXP=40
-ID=41
-WS=42
-ErrorCharacter=43
+PRED_OP=14
+AND=15
+OR=16
+VERT=17
+EXCL=18
+LPAREN=19
+RPAREN=20
+LCURLY=21
+RCURLY=22
+SQUOTE=23
+TILDA=24
+RIGHT=25
+LBR=26
+RBR=27
+COMMA=28
+COLON=29
+MINUS=30
+DOT=31
+UNDERSCORE=32
+EQ=33
+PLUS=34
+QUESTION=35
+STAR=36
+BOOL=37
+INT=38
+EXP=39
+ID=40
+WS=41
+ErrorCharacter=42
 'intent'=1
-'conv'=2
-'ordered'=3
-'flow'=4
-'term'=5
-'id'=6
-'aliases'=7
-'startidx'=8
-'endidx'=9
-'parent'=10
-'groups'=11
-'ancestors'=12
-'value'=13
-'null'=14
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
+'ordered'=2
+'flow'=3
+'term'=4
+'id'=5
+'aliases'=6
+'startidx'=7
+'endidx'=8
+'parent'=9
+'groups'=10
+'ancestors'=11
+'value'=12
+'null'=13
+'&&'=15
+'||'=16
+'|'=17
+'!'=18
+'('=19
+')'=20
+'{'=21
+'}'=22
+'\''=23
+'~'=24
+'>>'=25
+'['=26
+']'=27
+','=28
+':'=29
+'-'=30
+'.'=31
+'_'=32
+'='=33
+'+'=34
+'?'=35
+'*'=36
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 f600b0d..59ff399 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/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
+// 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.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
@@ -28,16 +28,6 @@ public interface NCIntentDslListener extends 
ParseTreeListener {
         */
        void exitIntentId(NCIntentDslParser.IntentIdContext ctx);
        /**
-        * Enter a parse tree produced by {@link NCIntentDslParser#convDecl}.
-        * @param ctx the parse tree
-        */
-       void enterConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-       /**
-        * Exit a parse tree produced by {@link NCIntentDslParser#convDecl}.
-        * @param ctx the parse tree
-        */
-       void exitConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-       /**
         * Enter a parse tree produced by {@link NCIntentDslParser#orderedDecl}.
         * @param ctx the parse tree
         */
@@ -108,6 +98,16 @@ public interface NCIntentDslListener extends 
ParseTreeListener {
         */
        void exitTerms(NCIntentDslParser.TermsContext ctx);
        /**
+        * Enter a parse tree produced by {@link NCIntentDslParser#termEq}.
+        * @param ctx the parse tree
+        */
+       void enterTermEq(NCIntentDslParser.TermEqContext ctx);
+       /**
+        * Exit a parse tree produced by {@link NCIntentDslParser#termEq}.
+        * @param ctx the parse tree
+        */
+       void exitTermEq(NCIntentDslParser.TermEqContext ctx);
+       /**
         * Enter a parse tree produced by {@link NCIntentDslParser#term}.
         * @param ctx the parse tree
         */
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 66f90dd..ef12ce8 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,10 +1,13 @@
-// Generated from 
/Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
+// 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.8
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
 import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
 import org.antlr.v4.runtime.tree.*;
 import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslParser extends Parser {
@@ -15,22 +18,22 @@ public class NCIntentDslParser extends Parser {
                new PredictionContextCache();
        public static final int
                T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, 
T__8=9, 
-               T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, PRED_OP=15, 
AND=16, OR=17, 
-               VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, 
SQUOTE=24, 
-               TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, 
MINUS=31, DOT=32, 
-               UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, BOOL=38, 
INT=39, 
-               EXP=40, ID=41, WS=42, ErrorCharacter=43;
+               T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, 
OR=16, VERT=17, 
+               EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, 
TILDA=24, 
+               RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, 
UNDERSCORE=32, 
+               EQ=33, PLUS=34, QUESTION=35, STAR=36, BOOL=37, INT=38, EXP=39, 
ID=40, 
+               WS=41, ErrorCharacter=42;
        public static final int
-               RULE_intent = 0, RULE_intentId = 1, RULE_convDecl = 2, 
RULE_orderedDecl = 3, 
-               RULE_flowDecl = 4, RULE_flow = 5, RULE_flowItem = 6, 
RULE_flowItemIds = 7, 
-               RULE_idList = 8, RULE_terms = 9, RULE_term = 10, RULE_termId = 
11, RULE_item = 12, 
+               RULE_intent = 0, RULE_intentId = 1, RULE_orderedDecl = 2, 
RULE_flowDecl = 3, 
+               RULE_flow = 4, RULE_flowItem = 5, RULE_flowItemIds = 6, 
RULE_idList = 7, 
+               RULE_terms = 8, RULE_termEq = 9, RULE_term = 10, RULE_termId = 
11, RULE_item = 12, 
                RULE_predicate = 13, RULE_lval = 14, RULE_lvalQual = 15, 
RULE_lvalPart = 16, 
                RULE_rvalSingle = 17, RULE_rval = 18, RULE_rvalList = 19, 
RULE_meta = 20, 
                RULE_qstring = 21, RULE_minMax = 22, RULE_minMaxShortcut = 23, 
RULE_minMaxRange = 24;
        private static String[] makeRuleNames() {
                return new String[] {
-                       "intent", "intentId", "convDecl", "orderedDecl", 
"flowDecl", "flow", 
-                       "flowItem", "flowItemIds", "idList", "terms", "term", 
"termId", "item", 
+                       "intent", "intentId", "orderedDecl", "flowDecl", 
"flow", "flowItem", 
+                       "flowItemIds", "idList", "terms", "termEq", "term", 
"termId", "item", 
                        "predicate", "lval", "lvalQual", "lvalPart", 
"rvalSingle", "rval", "rvalList", 
                        "meta", "qstring", "minMax", "minMaxShortcut", 
"minMaxRange"
                };
@@ -39,18 +42,18 @@ public class NCIntentDslParser extends Parser {
 
        private static String[] makeLiteralNames() {
                return new String[] {
-                       null, "'intent'", "'conv'", "'ordered'", "'flow'", 
"'term'", "'id'", 
-                       "'aliases'", "'startidx'", "'endidx'", "'parent'", 
"'groups'", "'ancestors'", 
-                       "'value'", "'null'", null, "'&&'", "'||'", "'|'", 
"'!'", "'('", "')'", 
-                       "'{'", "'}'", "'''", "'~'", "'>>'", "'['", "']'", 
"','", "':'", "'-'", 
-                       "'.'", "'_'", "'='", "'+'", "'?'", "'*'"
+                       null, "'intent'", "'ordered'", "'flow'", "'term'", 
"'id'", "'aliases'", 
+                       "'startidx'", "'endidx'", "'parent'", "'groups'", 
"'ancestors'", "'value'", 
+                       "'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", 
"')'", "'{'", "'}'", 
+                       "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", 
"'-'", "'.'", "'_'", 
+                       "'='", "'+'", "'?'", "'*'"
                };
        }
        private static final String[] _LITERAL_NAMES = makeLiteralNames();
        private static String[] makeSymbolicNames() {
                return new String[] {
                        null, null, null, null, null, null, null, null, null, 
null, null, null, 
-                       null, null, null, "PRED_OP", "AND", "OR", "VERT", 
"EXCL", "LPAREN", "RPAREN", 
+                       null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", 
"LPAREN", "RPAREN", 
                        "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", 
"RBR", "COMMA", 
                        "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", 
"QUESTION", "STAR", 
                        "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
@@ -115,9 +118,6 @@ public class NCIntentDslParser extends Parser {
                        return getRuleContext(TermsContext.class,0);
                }
                public TerminalNode EOF() { return 
getToken(NCIntentDslParser.EOF, 0); }
-               public ConvDeclContext convDecl() {
-                       return getRuleContext(ConvDeclContext.class,0);
-               }
                public OrderedDeclContext orderedDecl() {
                        return getRuleContext(OrderedDeclContext.class,0);
                }
@@ -136,11 +136,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitIntent(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitIntent(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final IntentContext intent() throws RecognitionException {
@@ -158,7 +153,7 @@ public class NCIntentDslParser extends Parser {
                        if (_la==T__1) {
                                {
                                setState(51);
-                               convDecl();
+                               orderedDecl();
                                }
                        }
 
@@ -168,23 +163,13 @@ public class NCIntentDslParser extends Parser {
                        if (_la==T__2) {
                                {
                                setState(54);
-                               orderedDecl();
-                               }
-                       }
-
-                       setState(58);
-                       _errHandler.sync(this);
-                       _la = _input.LA(1);
-                       if (_la==T__3) {
-                               {
-                               setState(57);
                                flowDecl();
                                }
                        }
 
-                       setState(60);
+                       setState(57);
                        terms(0);
-                       setState(61);
+                       setState(58);
                        match(EOF);
                        }
                }
@@ -214,11 +199,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitIntentId(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitIntentId(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final IntentIdContext intentId() throws RecognitionException {
@@ -227,11 +207,11 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(63);
+                       setState(60);
                        match(T__0);
-                       setState(64);
+                       setState(61);
                        match(EQ);
-                       setState(65);
+                       setState(62);
                        match(ID);
                        }
                }
@@ -246,53 +226,6 @@ public class NCIntentDslParser extends Parser {
                return _localctx;
        }
 
-       public static class ConvDeclContext extends ParserRuleContext {
-               public TerminalNode EQ() { return 
getToken(NCIntentDslParser.EQ, 0); }
-               public TerminalNode BOOL() { return 
getToken(NCIntentDslParser.BOOL, 0); }
-               public ConvDeclContext(ParserRuleContext parent, int 
invokingState) {
-                       super(parent, invokingState);
-               }
-               @Override public int getRuleIndex() { return RULE_convDecl; }
-               @Override
-               public void enterRule(ParseTreeListener listener) {
-                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).enterConvDecl(this);
-               }
-               @Override
-               public void exitRule(ParseTreeListener listener) {
-                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitConvDecl(this);
-               }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitConvDecl(this);
-                       else return visitor.visitChildren(this);
-               }
-       }
-
-       public final ConvDeclContext convDecl() throws RecognitionException {
-               ConvDeclContext _localctx = new ConvDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 4, RULE_convDecl);
-               try {
-                       enterOuterAlt(_localctx, 1);
-                       {
-                       setState(67);
-                       match(T__1);
-                       setState(68);
-                       match(EQ);
-                       setState(69);
-                       match(BOOL);
-                       }
-               }
-               catch (RecognitionException re) {
-                       _localctx.exception = re;
-                       _errHandler.reportError(this, re);
-                       _errHandler.recover(this, re);
-               }
-               finally {
-                       exitRule();
-               }
-               return _localctx;
-       }
-
        public static class OrderedDeclContext extends ParserRuleContext {
                public TerminalNode EQ() { return 
getToken(NCIntentDslParser.EQ, 0); }
                public TerminalNode BOOL() { return 
getToken(NCIntentDslParser.BOOL, 0); }
@@ -308,24 +241,19 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitOrderedDecl(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitOrderedDecl(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final OrderedDeclContext orderedDecl() throws 
RecognitionException {
                OrderedDeclContext _localctx = new OrderedDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 6, RULE_orderedDecl);
+               enterRule(_localctx, 4, RULE_orderedDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(71);
-                       match(T__2);
-                       setState(72);
+                       setState(64);
+                       match(T__1);
+                       setState(65);
                        match(EQ);
-                       setState(73);
+                       setState(66);
                        match(BOOL);
                        }
                }
@@ -361,28 +289,23 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitFlowDecl(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitFlowDecl(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final FlowDeclContext flowDecl() throws RecognitionException {
                FlowDeclContext _localctx = new FlowDeclContext(_ctx, 
getState());
-               enterRule(_localctx, 8, RULE_flowDecl);
+               enterRule(_localctx, 6, RULE_flowDecl);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(75);
-                       match(T__3);
-                       setState(76);
+                       setState(68);
+                       match(T__2);
+                       setState(69);
                        match(EQ);
-                       setState(77);
+                       setState(70);
                        match(SQUOTE);
-                       setState(78);
+                       setState(71);
                        flow(0);
-                       setState(79);
+                       setState(72);
                        match(SQUOTE);
                        }
                }
@@ -417,11 +340,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitFlow(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitFlow(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final FlowContext flow() throws RecognitionException {
@@ -433,30 +351,30 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                FlowContext _localctx = new FlowContext(_ctx, _parentState);
                FlowContext _prevctx = _localctx;
-               int _startState = 10;
-               enterRecursionRule(_localctx, 10, RULE_flow, _p);
+               int _startState = 8;
+               enterRecursionRule(_localctx, 8, RULE_flow, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(83);
+                       setState(76);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,3,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,2,_ctx) ) {
                        case 1:
                                {
                                }
                                break;
                        case 2:
                                {
-                               setState(82);
+                               setState(75);
                                flowItem();
                                }
                                break;
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(90);
+                       setState(83);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,3,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -465,18 +383,18 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new FlowContext(_parentctx, 
_parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_flow);
-                                       setState(85);
+                                       setState(78);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(86);
+                                       setState(79);
                                        match(RIGHT);
-                                       setState(87);
+                                       setState(80);
                                        flowItem();
                                        }
                                        } 
                                }
-                               setState(92);
+                               setState(85);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,4,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,3,_ctx);
                        }
                        }
                }
@@ -510,27 +428,22 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitFlowItem(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitFlowItem(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final FlowItemContext flowItem() throws RecognitionException {
                FlowItemContext _localctx = new FlowItemContext(_ctx, 
getState());
-               enterRule(_localctx, 12, RULE_flowItem);
+               enterRule(_localctx, 10, RULE_flowItem);
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(93);
+                       setState(86);
                        flowItemIds();
-                       setState(95);
+                       setState(88);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,4,_ctx) ) {
                        case 1:
                                {
-                               setState(94);
+                               setState(87);
                                minMax();
                                }
                                break;
@@ -567,35 +480,30 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitFlowItemIds(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitFlowItemIds(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final FlowItemIdsContext flowItemIds() throws 
RecognitionException {
                FlowItemIdsContext _localctx = new FlowItemIdsContext(_ctx, 
getState());
-               enterRule(_localctx, 14, RULE_flowItemIds);
+               enterRule(_localctx, 12, RULE_flowItemIds);
                try {
-                       setState(102);
+                       setState(95);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case ID:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(97);
+                               setState(90);
                                match(ID);
                                }
                                break;
                        case LPAREN:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(98);
+                               setState(91);
                                match(LPAREN);
-                               setState(99);
+                               setState(92);
                                idList(0);
-                               setState(100);
+                               setState(93);
                                match(RPAREN);
                                }
                                break;
@@ -632,11 +540,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitIdList(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitIdList(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final IdListContext idList() throws RecognitionException {
@@ -648,20 +551,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                IdListContext _localctx = new IdListContext(_ctx, _parentState);
                IdListContext _prevctx = _localctx;
-               int _startState = 16;
-               enterRecursionRule(_localctx, 16, RULE_idList, _p);
+               int _startState = 14;
+               enterRecursionRule(_localctx, 14, RULE_idList, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(105);
+                       setState(98);
                        match(ID);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(112);
+                       setState(105);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,6,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -670,18 +573,18 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
IdListContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_idList);
-                                       setState(107);
+                                       setState(100);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(108);
+                                       setState(101);
                                        match(VERT);
-                                       setState(109);
+                                       setState(102);
                                        match(ID);
                                        }
                                        } 
                                }
-                               setState(114);
+                               setState(107);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,7,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,6,_ctx);
                        }
                        }
                }
@@ -715,11 +618,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitTerms(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitTerms(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final TermsContext terms() throws RecognitionException {
@@ -731,20 +629,20 @@ public class NCIntentDslParser extends Parser {
                int _parentState = getState();
                TermsContext _localctx = new TermsContext(_ctx, _parentState);
                TermsContext _prevctx = _localctx;
-               int _startState = 18;
-               enterRecursionRule(_localctx, 18, RULE_terms, _p);
+               int _startState = 16;
+               enterRecursionRule(_localctx, 16, RULE_terms, _p);
                try {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(116);
+                       setState(109);
                        term();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(122);
+                       setState(115);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,8,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,7,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -753,16 +651,16 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
TermsContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_terms);
-                                       setState(118);
+                                       setState(111);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(119);
+                                       setState(112);
                                        term();
                                        }
                                        } 
                                }
-                               setState(124);
+                               setState(117);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,8,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,7,_ctx);
                        }
                        }
                }
@@ -777,8 +675,57 @@ public class NCIntentDslParser extends Parser {
                return _localctx;
        }
 
-       public static class TermContext extends ParserRuleContext {
+       public static class TermEqContext extends ParserRuleContext {
                public TerminalNode EQ() { return 
getToken(NCIntentDslParser.EQ, 0); }
+               public TerminalNode TILDA() { return 
getToken(NCIntentDslParser.TILDA, 0); }
+               public TermEqContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_termEq; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).enterTermEq(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitTermEq(this);
+               }
+       }
+
+       public final TermEqContext termEq() throws RecognitionException {
+               TermEqContext _localctx = new TermEqContext(_ctx, getState());
+               enterRule(_localctx, 18, RULE_termEq);
+               int _la;
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(118);
+                       _la = _input.LA(1);
+                       if ( !(_la==TILDA || _la==EQ) ) {
+                       _errHandler.recoverInline(this);
+                       }
+                       else {
+                               if ( _input.LA(1)==Token.EOF ) matchedEOF = 
true;
+                               _errHandler.reportMatch(this);
+                               consume();
+                       }
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class TermContext extends ParserRuleContext {
+               public TermEqContext termEq() {
+                       return getRuleContext(TermEqContext.class,0);
+               }
                public TerminalNode LCURLY() { return 
getToken(NCIntentDslParser.LCURLY, 0); }
                public ItemContext item() {
                        return getRuleContext(ItemContext.class,0);
@@ -802,11 +749,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitTerm(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitTerm(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final TermContext term() throws RecognitionException {
@@ -816,32 +758,32 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(125);
-                       match(T__4);
-                       setState(127);
+                       setState(120);
+                       match(T__3);
+                       setState(122);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==LPAREN) {
                                {
-                               setState(126);
+                               setState(121);
                                termId();
                                }
                        }
 
-                       setState(129);
-                       match(EQ);
-                       setState(130);
+                       setState(124);
+                       termEq();
+                       setState(125);
                        match(LCURLY);
-                       setState(131);
+                       setState(126);
                        item(0);
-                       setState(132);
+                       setState(127);
                        match(RCURLY);
-                       setState(134);
+                       setState(129);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,10,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,9,_ctx) ) {
                        case 1:
                                {
-                               setState(133);
+                               setState(128);
                                minMax();
                                }
                                break;
@@ -875,11 +817,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitTermId(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitTermId(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final TermIdContext termId() throws RecognitionException {
@@ -888,11 +825,11 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(136);
+                       setState(131);
                        match(LPAREN);
-                       setState(137);
+                       setState(132);
                        match(ID);
-                       setState(138);
+                       setState(133);
                        match(RPAREN);
                        }
                }
@@ -934,11 +871,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitItem(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitItem(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final ItemContext item() throws RecognitionException {
@@ -957,9 +889,10 @@ public class NCIntentDslParser extends Parser {
                        int _alt;
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(148);
+                       setState(143);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
+                       case T__4:
                        case T__5:
                        case T__6:
                        case T__7:
@@ -967,29 +900,28 @@ public class NCIntentDslParser extends Parser {
                        case T__9:
                        case T__10:
                        case T__11:
-                       case T__12:
                        case TILDA:
                        case ID:
                                {
-                               setState(141);
+                               setState(136);
                                predicate();
                                }
                                break;
                        case LPAREN:
                                {
-                               setState(142);
+                               setState(137);
                                match(LPAREN);
-                               setState(143);
+                               setState(138);
                                item(0);
-                               setState(144);
+                               setState(139);
                                match(RPAREN);
                                }
                                break;
                        case EXCL:
                                {
-                               setState(146);
+                               setState(141);
                                match(EXCL);
-                               setState(147);
+                               setState(142);
                                item(1);
                                }
                                break;
@@ -997,9 +929,9 @@ public class NCIntentDslParser extends Parser {
                                throw new NoViableAltException(this);
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(155);
+                       setState(150);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,12,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,11,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -1008,9 +940,9 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new ItemContext(_parentctx, 
_parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_item);
-                                       setState(150);
+                                       setState(145);
                                        if (!(precpred(_ctx, 2))) throw new 
FailedPredicateException(this, "precpred(_ctx, 2)");
-                                       setState(151);
+                                       setState(146);
                                        _la = _input.LA(1);
                                        if ( !(_la==AND || _la==OR) ) {
                                        _errHandler.recoverInline(this);
@@ -1020,14 +952,14 @@ public class NCIntentDslParser extends Parser {
                                                _errHandler.reportMatch(this);
                                                consume();
                                        }
-                                       setState(152);
+                                       setState(147);
                                        item(3);
                                        }
                                        } 
                                }
-                               setState(157);
+                               setState(152);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,12,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,11,_ctx);
                        }
                        }
                }
@@ -1065,45 +997,40 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitPredicate(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitPredicate(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final PredicateContext predicate() throws RecognitionException {
                PredicateContext _localctx = new PredicateContext(_ctx, 
getState());
                enterRule(_localctx, 26, RULE_predicate);
                try {
-                       setState(169);
+                       setState(164);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,12,_ctx) ) {
                        case 1:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(158);
+                               setState(153);
                                lval();
-                               setState(159);
+                               setState(154);
                                match(PRED_OP);
-                               setState(160);
+                               setState(155);
                                rval();
                                }
                                break;
                        case 2:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(162);
+                               setState(157);
                                match(ID);
-                               setState(163);
+                               setState(158);
                                match(LPAREN);
-                               setState(164);
+                               setState(159);
                                lval();
-                               setState(165);
+                               setState(160);
                                match(RPAREN);
-                               setState(166);
+                               setState(161);
                                match(PRED_OP);
-                               setState(167);
+                               setState(162);
                                rval();
                                }
                                break;
@@ -1139,11 +1066,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitLval(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitLval(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final LvalContext lval() throws RecognitionException {
@@ -1153,70 +1075,70 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(172);
+                       setState(167);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la==ID) {
                                {
-                               setState(171);
+                               setState(166);
                                lvalQual(0);
                                }
                        }
 
-                       setState(183);
+                       setState(178);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
+                       case T__4:
+                               {
+                               setState(169);
+                               match(T__4);
+                               }
+                               break;
                        case T__5:
                                {
-                               setState(174);
+                               setState(170);
                                match(T__5);
                                }
                                break;
                        case T__6:
                                {
-                               setState(175);
+                               setState(171);
                                match(T__6);
                                }
                                break;
                        case T__7:
                                {
-                               setState(176);
+                               setState(172);
                                match(T__7);
                                }
                                break;
                        case T__8:
                                {
-                               setState(177);
+                               setState(173);
                                match(T__8);
                                }
                                break;
                        case T__9:
                                {
-                               setState(178);
+                               setState(174);
                                match(T__9);
                                }
                                break;
                        case T__10:
                                {
-                               setState(179);
+                               setState(175);
                                match(T__10);
                                }
                                break;
                        case T__11:
                                {
-                               setState(180);
+                               setState(176);
                                match(T__11);
                                }
                                break;
-                       case T__12:
-                               {
-                               setState(181);
-                               match(T__12);
-                               }
-                               break;
                        case TILDA:
                                {
-                               setState(182);
+                               setState(177);
                                meta();
                                }
                                break;
@@ -1255,11 +1177,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitLvalQual(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitLvalQual(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final LvalQualContext lvalQual() throws RecognitionException {
@@ -1278,13 +1195,13 @@ public class NCIntentDslParser extends Parser {
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(186);
+                       setState(181);
                        lvalPart();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(192);
+                       setState(187);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,16,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,15,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -1293,16 +1210,16 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
LvalQualContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_lvalQual);
-                                       setState(188);
+                                       setState(183);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(189);
+                                       setState(184);
                                        lvalPart();
                                        }
                                        } 
                                }
-                               setState(194);
+                               setState(189);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,16,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,15,_ctx);
                        }
                        }
                }
@@ -1332,11 +1249,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitLvalPart(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitLvalPart(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final LvalPartContext lvalPart() throws RecognitionException {
@@ -1345,9 +1257,9 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(195);
+                       setState(190);
                        match(ID);
-                       setState(196);
+                       setState(191);
                        match(DOT);
                        }
                }
@@ -1382,11 +1294,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitRvalSingle(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitRvalSingle(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final RvalSingleContext rvalSingle() throws RecognitionException 
{
@@ -1394,44 +1301,44 @@ public class NCIntentDslParser extends Parser {
                enterRule(_localctx, 34, RULE_rvalSingle);
                int _la;
                try {
-                       setState(209);
+                       setState(204);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
-                       case T__13:
+                       case T__12:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(198);
-                               match(T__13);
+                               setState(193);
+                               match(T__12);
                                }
                                break;
                        case MINUS:
                        case INT:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(200);
+                               setState(195);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                                if (_la==MINUS) {
                                        {
-                                       setState(199);
+                                       setState(194);
                                        match(MINUS);
                                        }
                                }
 
-                               setState(205);
+                               setState(200);
                                _errHandler.sync(this);
-                               switch ( 
getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+                               switch ( 
getInterpreter().adaptivePredict(_input,17,_ctx) ) {
                                case 1:
                                        {
-                                       setState(202);
+                                       setState(197);
                                        match(INT);
                                        }
                                        break;
                                case 2:
                                        {
-                                       setState(203);
+                                       setState(198);
                                        match(INT);
-                                       setState(204);
+                                       setState(199);
                                        match(EXP);
                                        }
                                        break;
@@ -1441,14 +1348,14 @@ public class NCIntentDslParser extends Parser {
                        case BOOL:
                                enterOuterAlt(_localctx, 3);
                                {
-                               setState(207);
+                               setState(202);
                                match(BOOL);
                                }
                                break;
                        case SQUOTE:
                                enterOuterAlt(_localctx, 4);
                                {
-                               setState(208);
+                               setState(203);
                                qstring();
                                }
                                break;
@@ -1488,39 +1395,34 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitRval(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitRval(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final RvalContext rval() throws RecognitionException {
                RvalContext _localctx = new RvalContext(_ctx, getState());
                enterRule(_localctx, 36, RULE_rval);
                try {
-                       setState(216);
+                       setState(211);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
-                       case T__13:
+                       case T__12:
                        case SQUOTE:
                        case MINUS:
                        case BOOL:
                        case INT:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(211);
+                               setState(206);
                                rvalSingle();
                                }
                                break;
                        case LPAREN:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(212);
+                               setState(207);
                                match(LPAREN);
-                               setState(213);
+                               setState(208);
                                rvalList(0);
-                               setState(214);
+                               setState(209);
                                match(RPAREN);
                                }
                                break;
@@ -1559,11 +1461,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitRvalList(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitRvalList(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final RvalListContext rvalList() throws RecognitionException {
@@ -1582,13 +1479,13 @@ public class NCIntentDslParser extends Parser {
                        enterOuterAlt(_localctx, 1);
                        {
                        {
-                       setState(219);
+                       setState(214);
                        rvalSingle();
                        }
                        _ctx.stop = _input.LT(-1);
-                       setState(226);
+                       setState(221);
                        _errHandler.sync(this);
-                       _alt = getInterpreter().adaptivePredict(_input,21,_ctx);
+                       _alt = getInterpreter().adaptivePredict(_input,20,_ctx);
                        while ( _alt!=2 && 
_alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
                                if ( _alt==1 ) {
                                        if ( _parseListeners!=null ) 
triggerExitRuleEvent();
@@ -1597,18 +1494,18 @@ public class NCIntentDslParser extends Parser {
                                        {
                                        _localctx = new 
RvalListContext(_parentctx, _parentState);
                                        pushNewRecursionContext(_localctx, 
_startState, RULE_rvalList);
-                                       setState(221);
+                                       setState(216);
                                        if (!(precpred(_ctx, 1))) throw new 
FailedPredicateException(this, "precpred(_ctx, 1)");
-                                       setState(222);
+                                       setState(217);
                                        match(COMMA);
-                                       setState(223);
+                                       setState(218);
                                        rvalSingle();
                                        }
                                        } 
                                }
-                               setState(228);
+                               setState(223);
                                _errHandler.sync(this);
-                               _alt = 
getInterpreter().adaptivePredict(_input,21,_ctx);
+                               _alt = 
getInterpreter().adaptivePredict(_input,20,_ctx);
                        }
                        }
                }
@@ -1644,56 +1541,51 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitMeta(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitMeta(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final MetaContext meta() throws RecognitionException {
                MetaContext _localctx = new MetaContext(_ctx, getState());
                enterRule(_localctx, 40, RULE_meta);
                try {
-                       setState(242);
+                       setState(237);
                        _errHandler.sync(this);
-                       switch ( 
getInterpreter().adaptivePredict(_input,22,_ctx) ) {
+                       switch ( 
getInterpreter().adaptivePredict(_input,21,_ctx) ) {
                        case 1:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(229);
+                               setState(224);
                                match(TILDA);
-                               setState(230);
+                               setState(225);
                                match(ID);
                                }
                                break;
                        case 2:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(231);
+                               setState(226);
                                match(TILDA);
-                               setState(232);
+                               setState(227);
                                match(ID);
-                               setState(233);
+                               setState(228);
                                match(LBR);
-                               setState(234);
+                               setState(229);
                                match(INT);
-                               setState(235);
+                               setState(230);
                                match(RBR);
                                }
                                break;
                        case 3:
                                enterOuterAlt(_localctx, 3);
                                {
-                               setState(236);
+                               setState(231);
                                match(TILDA);
-                               setState(237);
+                               setState(232);
                                match(ID);
-                               setState(238);
+                               setState(233);
                                match(LBR);
-                               setState(239);
+                               setState(234);
                                qstring();
-                               setState(240);
+                               setState(235);
                                match(RBR);
                                }
                                break;
@@ -1727,11 +1619,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitQstring(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitQstring(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final QstringContext qstring() throws RecognitionException {
@@ -1741,15 +1628,15 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(244);
+                       setState(239);
                        match(SQUOTE);
-                       setState(248);
+                       setState(243);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
-                       while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << 
T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << 
T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << PRED_OP) | (1L 
<< AND) | (1L << OR) | (1L << VERT) | (1L << EXCL) | (1L << LPAREN) | (1L << 
RPAREN) | (1L << LCURLY) | (1L << RCURLY) | (1L << TILDA) | (1L << RIGHT) | (1L 
<< LBR) | (1L << RBR) | (1L << COMMA) | (1L << C [...]
+                       while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << 
T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << 
T__10) | (1L << T__11) | (1L << T__12) | (1L << PRED_OP) | (1L << AND) | (1L << 
OR) | (1L << VERT) | (1L << EXCL) | (1L << LPAREN) | (1L << RPAREN) | (1L << 
LCURLY) | (1L << RCURLY) | (1L << TILDA) | (1L << RIGHT) | (1L << LBR) | (1L << 
RBR) | (1L << COMMA) | (1L << COLON) | (1L << M [...]
                                {
                                {
-                               setState(245);
+                               setState(240);
                                _la = _input.LA(1);
                                if ( _la <= 0 || (_la==SQUOTE) ) {
                                _errHandler.recoverInline(this);
@@ -1761,11 +1648,11 @@ public class NCIntentDslParser extends Parser {
                                }
                                }
                                }
-                               setState(250);
+                               setState(245);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                        }
-                       setState(251);
+                       setState(246);
                        match(SQUOTE);
                        }
                }
@@ -1799,18 +1686,13 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitMinMax(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitMinMax(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final MinMaxContext minMax() throws RecognitionException {
                MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
                enterRule(_localctx, 44, RULE_minMax);
                try {
-                       setState(255);
+                       setState(250);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                        case PLUS:
@@ -1818,14 +1700,14 @@ public class NCIntentDslParser extends Parser {
                        case STAR:
                                enterOuterAlt(_localctx, 1);
                                {
-                               setState(253);
+                               setState(248);
                                minMaxShortcut();
                                }
                                break;
                        case LBR:
                                enterOuterAlt(_localctx, 2);
                                {
-                               setState(254);
+                               setState(249);
                                minMaxRange();
                                }
                                break;
@@ -1860,11 +1742,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitMinMaxShortcut(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxShortcut(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final MinMaxShortcutContext minMaxShortcut() throws 
RecognitionException {
@@ -1874,7 +1751,7 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(257);
+                       setState(252);
                        _la = _input.LA(1);
                        if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
PLUS) | (1L << QUESTION) | (1L << STAR))) != 0)) ) {
                        _errHandler.recoverInline(this);
@@ -1917,11 +1794,6 @@ public class NCIntentDslParser extends Parser {
                public void exitRule(ParseTreeListener listener) {
                        if ( listener instanceof NCIntentDslListener ) 
((NCIntentDslListener)listener).exitMinMaxRange(this);
                }
-               @Override
-               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
-                       if ( visitor instanceof NCIntentDslVisitor ) return 
((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxRange(this);
-                       else return visitor.visitChildren(this);
-               }
        }
 
        public final MinMaxRangeContext minMaxRange() throws 
RecognitionException {
@@ -1930,15 +1802,15 @@ public class NCIntentDslParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(259);
+                       setState(254);
                        match(LBR);
-                       setState(260);
+                       setState(255);
                        match(INT);
-                       setState(261);
+                       setState(256);
                        match(COMMA);
-                       setState(262);
+                       setState(257);
                        match(INT);
-                       setState(263);
+                       setState(258);
                        match(RBR);
                        }
                }
@@ -1955,11 +1827,11 @@ public class NCIntentDslParser extends Parser {
 
        public boolean sempred(RuleContext _localctx, int ruleIndex, int 
predIndex) {
                switch (ruleIndex) {
-               case 5:
+               case 4:
                        return flow_sempred((FlowContext)_localctx, predIndex);
-               case 8:
+               case 7:
                        return idList_sempred((IdListContext)_localctx, 
predIndex);
-               case 9:
+               case 8:
                        return terms_sempred((TermsContext)_localctx, 
predIndex);
                case 12:
                        return item_sempred((ItemContext)_localctx, predIndex);
@@ -2014,95 +1886,93 @@ public class NCIntentDslParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3-\u010c\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"+
-               
"\4\32\t\32\3\2\3\2\5\2\67\n\2\3\2\5\2:\n\2\3\2\5\2=\n\2\3\2\3\2\3\2\3"+
-               
"\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6"+
-               
"\3\7\3\7\5\7V\n\7\3\7\3\7\3\7\7\7[\n\7\f\7\16\7^\13\7\3\b\3\b\5\bb\n\b"+
-               
"\3\t\3\t\3\t\3\t\3\t\5\ti\n\t\3\n\3\n\3\n\3\n\3\n\3\n\7\nq\n\n\f\n\16"+
-               
"\nt\13\n\3\13\3\13\3\13\3\13\3\13\7\13{\n\13\f\13\16\13~\13\13\3\f\3\f"+
-               
"\5\f\u0082\n\f\3\f\3\f\3\f\3\f\3\f\5\f\u0089\n\f\3\r\3\r\3\r\3\r\3\16"+
-               
"\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u0097\n\16\3\16\3\16\3\16\7\16"+
-               
"\u009c\n\16\f\16\16\16\u009f\13\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+
-               
"\3\17\3\17\3\17\3\17\5\17\u00ac\n\17\3\20\5\20\u00af\n\20\3\20\3\20\3"+
-               
"\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00ba\n\20\3\21\3\21\3\21\3\21"+
-               
"\3\21\7\21\u00c1\n\21\f\21\16\21\u00c4\13\21\3\22\3\22\3\22\3\23\3\23"+
-               
"\5\23\u00cb\n\23\3\23\3\23\3\23\5\23\u00d0\n\23\3\23\3\23\5\23\u00d4\n"+
-               
"\23\3\24\3\24\3\24\3\24\3\24\5\24\u00db\n\24\3\25\3\25\3\25\3\25\3\25"+
-               
"\3\25\7\25\u00e3\n\25\f\25\16\25\u00e6\13\25\3\26\3\26\3\26\3\26\3\26"+
-               
"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u00f5\n\26\3\27\3\27\7\27"+
-               
"\u00f9\n\27\f\27\16\27\u00fc\13\27\3\27\3\27\3\30\3\30\5\30\u0102\n\30"+
-               "\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\2\b\f\22\24\32 
(\33\2\4"+
-               "\6\b\n\f\16\20\22\24\26\30\32\34\36 
\"$&(*,.\60\62\2\5\3\2\22\23\3\2\32"+
-               
"\32\3\2%\'\2\u0116\2\64\3\2\2\2\4A\3\2\2\2\6E\3\2\2\2\bI\3\2\2\2\nM\3"+
-               
"\2\2\2\fU\3\2\2\2\16_\3\2\2\2\20h\3\2\2\2\22j\3\2\2\2\24u\3\2\2\2\26\177"+
-               
"\3\2\2\2\30\u008a\3\2\2\2\32\u0096\3\2\2\2\34\u00ab\3\2\2\2\36\u00ae\3"+
-               "\2\2\2 
\u00bb\3\2\2\2\"\u00c5\3\2\2\2$\u00d3\3\2\2\2&\u00da\3\2\2\2(\u00dc"+
-               
"\3\2\2\2*\u00f4\3\2\2\2,\u00f6\3\2\2\2.\u0101\3\2\2\2\60\u0103\3\2\2\2"+
-               
"\62\u0105\3\2\2\2\64\66\5\4\3\2\65\67\5\6\4\2\66\65\3\2\2\2\66\67\3\2"+
-               
"\2\2\679\3\2\2\28:\5\b\5\298\3\2\2\29:\3\2\2\2:<\3\2\2\2;=\5\n\6\2<;\3"+
-               
"\2\2\2<=\3\2\2\2=>\3\2\2\2>?\5\24\13\2?@\7\2\2\3@\3\3\2\2\2AB\7\3\2\2"+
-               
"BC\7$\2\2CD\7+\2\2D\5\3\2\2\2EF\7\4\2\2FG\7$\2\2GH\7(\2\2H\7\3\2\2\2I"+
-               
"J\7\5\2\2JK\7$\2\2KL\7(\2\2L\t\3\2\2\2MN\7\6\2\2NO\7$\2\2OP\7\32\2\2P"+
-               
"Q\5\f\7\2QR\7\32\2\2R\13\3\2\2\2SV\b\7\1\2TV\5\16\b\2US\3\2\2\2UT\3\2"+
-               
"\2\2V\\\3\2\2\2WX\f\3\2\2XY\7\34\2\2Y[\5\16\b\2ZW\3\2\2\2[^\3\2\2\2\\"+
-               
"Z\3\2\2\2\\]\3\2\2\2]\r\3\2\2\2^\\\3\2\2\2_a\5\20\t\2`b\5.\30\2a`\3\2"+
-               
"\2\2ab\3\2\2\2b\17\3\2\2\2ci\7+\2\2de\7\26\2\2ef\5\22\n\2fg\7\27\2\2g"+
-               
"i\3\2\2\2hc\3\2\2\2hd\3\2\2\2i\21\3\2\2\2jk\b\n\1\2kl\7+\2\2lr\3\2\2\2"+
-               
"mn\f\3\2\2no\7\24\2\2oq\7+\2\2pm\3\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2\2"+
-               
"s\23\3\2\2\2tr\3\2\2\2uv\b\13\1\2vw\5\26\f\2w|\3\2\2\2xy\f\3\2\2y{\5\26"+
-               
"\f\2zx\3\2\2\2{~\3\2\2\2|z\3\2\2\2|}\3\2\2\2}\25\3\2\2\2~|\3\2\2\2\177"+
-               
"\u0081\7\7\2\2\u0080\u0082\5\30\r\2\u0081\u0080\3\2\2\2\u0081\u0082\3"+
-               
"\2\2\2\u0082\u0083\3\2\2\2\u0083\u0084\7$\2\2\u0084\u0085\7\30\2\2\u0085"+
-               
"\u0086\5\32\16\2\u0086\u0088\7\31\2\2\u0087\u0089\5.\30\2\u0088\u0087"+
-               
"\3\2\2\2\u0088\u0089\3\2\2\2\u0089\27\3\2\2\2\u008a\u008b\7\26\2\2\u008b"+
-               
"\u008c\7+\2\2\u008c\u008d\7\27\2\2\u008d\31\3\2\2\2\u008e\u008f\b\16\1"+
-               
"\2\u008f\u0097\5\34\17\2\u0090\u0091\7\26\2\2\u0091\u0092\5\32\16\2\u0092"+
-               
"\u0093\7\27\2\2\u0093\u0097\3\2\2\2\u0094\u0095\7\25\2\2\u0095\u0097\5"+
-               
"\32\16\3\u0096\u008e\3\2\2\2\u0096\u0090\3\2\2\2\u0096\u0094\3\2\2\2\u0097"+
-               
"\u009d\3\2\2\2\u0098\u0099\f\4\2\2\u0099\u009a\t\2\2\2\u009a\u009c\5\32"+
-               
"\16\5\u009b\u0098\3\2\2\2\u009c\u009f\3\2\2\2\u009d\u009b\3\2\2\2\u009d"+
-               
"\u009e\3\2\2\2\u009e\33\3\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a1\5\36\20"+
-               
"\2\u00a1\u00a2\7\21\2\2\u00a2\u00a3\5&\24\2\u00a3\u00ac\3\2\2\2\u00a4"+
-               
"\u00a5\7+\2\2\u00a5\u00a6\7\26\2\2\u00a6\u00a7\5\36\20\2\u00a7\u00a8\7"+
-               
"\27\2\2\u00a8\u00a9\7\21\2\2\u00a9\u00aa\5&\24\2\u00aa\u00ac\3\2\2\2\u00ab"+
-               
"\u00a0\3\2\2\2\u00ab\u00a4\3\2\2\2\u00ac\35\3\2\2\2\u00ad\u00af\5 \21"+
-               
"\2\u00ae\u00ad\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b9\3\2\2\2\u00b0\u00ba"+
-               
"\7\b\2\2\u00b1\u00ba\7\t\2\2\u00b2\u00ba\7\n\2\2\u00b3\u00ba\7\13\2\2"+
-               
"\u00b4\u00ba\7\f\2\2\u00b5\u00ba\7\r\2\2\u00b6\u00ba\7\16\2\2\u00b7\u00ba"+
-               
"\7\17\2\2\u00b8\u00ba\5*\26\2\u00b9\u00b0\3\2\2\2\u00b9\u00b1\3\2\2\2"+
-               
"\u00b9\u00b2\3\2\2\2\u00b9\u00b3\3\2\2\2\u00b9\u00b4\3\2\2\2\u00b9\u00b5"+
-               
"\3\2\2\2\u00b9\u00b6\3\2\2\2\u00b9\u00b7\3\2\2\2\u00b9\u00b8\3\2\2\2\u00ba"+
-               
"\37\3\2\2\2\u00bb\u00bc\b\21\1\2\u00bc\u00bd\5\"\22\2\u00bd\u00c2\3\2"+
-               
"\2\2\u00be\u00bf\f\3\2\2\u00bf\u00c1\5\"\22\2\u00c0\u00be\3\2\2\2\u00c1"+
-               
"\u00c4\3\2\2\2\u00c2\u00c0\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3!\3\2\2\2"+
-               
"\u00c4\u00c2\3\2\2\2\u00c5\u00c6\7+\2\2\u00c6\u00c7\7\"\2\2\u00c7#\3\2"+
-               
"\2\2\u00c8\u00d4\7\20\2\2\u00c9\u00cb\7!\2\2\u00ca\u00c9\3\2\2\2\u00ca"+
-               
"\u00cb\3\2\2\2\u00cb\u00cf\3\2\2\2\u00cc\u00d0\7)\2\2\u00cd\u00ce\7)\2"+
-               
"\2\u00ce\u00d0\7*\2\2\u00cf\u00cc\3\2\2\2\u00cf\u00cd\3\2\2\2\u00d0\u00d4"+
-               
"\3\2\2\2\u00d1\u00d4\7(\2\2\u00d2\u00d4\5,\27\2\u00d3\u00c8\3\2\2\2\u00d3"+
-               
"\u00ca\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d3\u00d2\3\2\2\2\u00d4%\3\2\2\2"+
-               
"\u00d5\u00db\5$\23\2\u00d6\u00d7\7\26\2\2\u00d7\u00d8\5(\25\2\u00d8\u00d9"+
-               
"\7\27\2\2\u00d9\u00db\3\2\2\2\u00da\u00d5\3\2\2\2\u00da\u00d6\3\2\2\2"+
-               
"\u00db\'\3\2\2\2\u00dc\u00dd\b\25\1\2\u00dd\u00de\5$\23\2\u00de\u00e4"+
-               
"\3\2\2\2\u00df\u00e0\f\3\2\2\u00e0\u00e1\7\37\2\2\u00e1\u00e3\5$\23\2"+
-               
"\u00e2\u00df\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3\2\2\2\u00e4\u00e5"+
-               
"\3\2\2\2\u00e5)\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e7\u00e8\7\33\2\2\u00e8"+
-               
"\u00f5\7+\2\2\u00e9\u00ea\7\33\2\2\u00ea\u00eb\7+\2\2\u00eb\u00ec\7\35"+
-               
"\2\2\u00ec\u00ed\7)\2\2\u00ed\u00f5\7\36\2\2\u00ee\u00ef\7\33\2\2\u00ef"+
-               
"\u00f0\7+\2\2\u00f0\u00f1\7\35\2\2\u00f1\u00f2\5,\27\2\u00f2\u00f3\7\36"+
-               
"\2\2\u00f3\u00f5\3\2\2\2\u00f4\u00e7\3\2\2\2\u00f4\u00e9\3\2\2\2\u00f4"+
-               
"\u00ee\3\2\2\2\u00f5+\3\2\2\2\u00f6\u00fa\7\32\2\2\u00f7\u00f9\n\3\2\2"+
-               
"\u00f8\u00f7\3\2\2\2\u00f9\u00fc\3\2\2\2\u00fa\u00f8\3\2\2\2\u00fa\u00fb"+
-               
"\3\2\2\2\u00fb\u00fd\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fd\u00fe\7\32\2\2"+
-               
"\u00fe-\3\2\2\2\u00ff\u0102\5\60\31\2\u0100\u0102\5\62\32\2\u0101\u00ff"+
-               
"\3\2\2\2\u0101\u0100\3\2\2\2\u0102/\3\2\2\2\u0103\u0104\t\4\2\2\u0104"+
-               
"\61\3\2\2\2\u0105\u0106\7\35\2\2\u0106\u0107\7)\2\2\u0107\u0108\7\37\2"+
-               
"\2\u0108\u0109\7)\2\2\u0109\u010a\7\36\2\2\u010a\63\3\2\2\2\33\669<U\\"+
-               
"ahr|\u0081\u0088\u0096\u009d\u00ab\u00ae\u00b9\u00c2\u00ca\u00cf\u00d3"+
-               "\u00da\u00e4\u00f4\u00fa\u0101";
+               
"\4\32\t\32\3\2\3\2\5\2\67\n\2\3\2\5\2:\n\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3"+
+               
"\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\5\6O\n\6\3\6\3\6\3\6"+
+               
"\7\6T\n\6\f\6\16\6W\13\6\3\7\3\7\5\7[\n\7\3\b\3\b\3\b\3\b\3\b\5\bb\n\b"+
+               
"\3\t\3\t\3\t\3\t\3\t\3\t\7\tj\n\t\f\t\16\tm\13\t\3\n\3\n\3\n\3\n\3\n\7"+
+               
"\nt\n\n\f\n\16\nw\13\n\3\13\3\13\3\f\3\f\5\f}\n\f\3\f\3\f\3\f\3\f\3\f"+
+               
"\5\f\u0084\n\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+
+               
"\5\16\u0092\n\16\3\16\3\16\3\16\7\16\u0097\n\16\f\16\16\16\u009a\13\16"+
+               
"\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\5\17\u00a7\n\17"+
+               
"\3\20\5\20\u00aa\n\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20"+
+               
"\u00b5\n\20\3\21\3\21\3\21\3\21\3\21\7\21\u00bc\n\21\f\21\16\21\u00bf"+
+               
"\13\21\3\22\3\22\3\22\3\23\3\23\5\23\u00c6\n\23\3\23\3\23\3\23\5\23\u00cb"+
+               
"\n\23\3\23\3\23\5\23\u00cf\n\23\3\24\3\24\3\24\3\24\3\24\5\24\u00d6\n"+
+               
"\24\3\25\3\25\3\25\3\25\3\25\3\25\7\25\u00de\n\25\f\25\16\25\u00e1\13"+
+               
"\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5"+
+               
"\26\u00f0\n\26\3\27\3\27\7\27\u00f4\n\27\f\27\16\27\u00f7\13\27\3\27\3"+
+               
"\27\3\30\3\30\5\30\u00fd\n\30\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32"+
+               "\3\32\2\b\n\20\22\32 
(\33\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&"+
+               
"(*,.\60\62\2\6\4\2\32\32##\3\2\21\22\3\2\31\31\3\2$&\2\u0110\2\64\3\2"+
+               
"\2\2\4>\3\2\2\2\6B\3\2\2\2\bF\3\2\2\2\nN\3\2\2\2\fX\3\2\2\2\16a\3\2\2"+
+               
"\2\20c\3\2\2\2\22n\3\2\2\2\24x\3\2\2\2\26z\3\2\2\2\30\u0085\3\2\2\2\32"+
+               "\u0091\3\2\2\2\34\u00a6\3\2\2\2\36\u00a9\3\2\2\2 
\u00b6\3\2\2\2\"\u00c0"+
+               
"\3\2\2\2$\u00ce\3\2\2\2&\u00d5\3\2\2\2(\u00d7\3\2\2\2*\u00ef\3\2\2\2,"+
+               
"\u00f1\3\2\2\2.\u00fc\3\2\2\2\60\u00fe\3\2\2\2\62\u0100\3\2\2\2\64\66"+
+               
"\5\4\3\2\65\67\5\6\4\2\66\65\3\2\2\2\66\67\3\2\2\2\679\3\2\2\28:\5\b\5"+
+               
"\298\3\2\2\29:\3\2\2\2:;\3\2\2\2;<\5\22\n\2<=\7\2\2\3=\3\3\2\2\2>?\7\3"+
+               
"\2\2?@\7#\2\2@A\7*\2\2A\5\3\2\2\2BC\7\4\2\2CD\7#\2\2DE\7\'\2\2E\7\3\2"+
+               
"\2\2FG\7\5\2\2GH\7#\2\2HI\7\31\2\2IJ\5\n\6\2JK\7\31\2\2K\t\3\2\2\2LO\b"+
+               
"\6\1\2MO\5\f\7\2NL\3\2\2\2NM\3\2\2\2OU\3\2\2\2PQ\f\3\2\2QR\7\33\2\2RT"+
+               
"\5\f\7\2SP\3\2\2\2TW\3\2\2\2US\3\2\2\2UV\3\2\2\2V\13\3\2\2\2WU\3\2\2\2"+
+               
"XZ\5\16\b\2Y[\5.\30\2ZY\3\2\2\2Z[\3\2\2\2[\r\3\2\2\2\\b\7*\2\2]^\7\25"+
+               
"\2\2^_\5\20\t\2_`\7\26\2\2`b\3\2\2\2a\\\3\2\2\2a]\3\2\2\2b\17\3\2\2\2"+
+               
"cd\b\t\1\2de\7*\2\2ek\3\2\2\2fg\f\3\2\2gh\7\23\2\2hj\7*\2\2if\3\2\2\2"+
+               
"jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2l\21\3\2\2\2mk\3\2\2\2no\b\n\1\2op\5\26"+
+               
"\f\2pu\3\2\2\2qr\f\3\2\2rt\5\26\f\2sq\3\2\2\2tw\3\2\2\2us\3\2\2\2uv\3"+
+               
"\2\2\2v\23\3\2\2\2wu\3\2\2\2xy\t\2\2\2y\25\3\2\2\2z|\7\6\2\2{}\5\30\r"+
+               
"\2|{\3\2\2\2|}\3\2\2\2}~\3\2\2\2~\177\5\24\13\2\177\u0080\7\27\2\2\u0080"+
+               
"\u0081\5\32\16\2\u0081\u0083\7\30\2\2\u0082\u0084\5.\30\2\u0083\u0082"+
+               
"\3\2\2\2\u0083\u0084\3\2\2\2\u0084\27\3\2\2\2\u0085\u0086\7\25\2\2\u0086"+
+               
"\u0087\7*\2\2\u0087\u0088\7\26\2\2\u0088\31\3\2\2\2\u0089\u008a\b\16\1"+
+               
"\2\u008a\u0092\5\34\17\2\u008b\u008c\7\25\2\2\u008c\u008d\5\32\16\2\u008d"+
+               
"\u008e\7\26\2\2\u008e\u0092\3\2\2\2\u008f\u0090\7\24\2\2\u0090\u0092\5"+
+               
"\32\16\3\u0091\u0089\3\2\2\2\u0091\u008b\3\2\2\2\u0091\u008f\3\2\2\2\u0092"+
+               
"\u0098\3\2\2\2\u0093\u0094\f\4\2\2\u0094\u0095\t\3\2\2\u0095\u0097\5\32"+
+               
"\16\5\u0096\u0093\3\2\2\2\u0097\u009a\3\2\2\2\u0098\u0096\3\2\2\2\u0098"+
+               
"\u0099\3\2\2\2\u0099\33\3\2\2\2\u009a\u0098\3\2\2\2\u009b\u009c\5\36\20"+
+               
"\2\u009c\u009d\7\20\2\2\u009d\u009e\5&\24\2\u009e\u00a7\3\2\2\2\u009f"+
+               
"\u00a0\7*\2\2\u00a0\u00a1\7\25\2\2\u00a1\u00a2\5\36\20\2\u00a2\u00a3\7"+
+               
"\26\2\2\u00a3\u00a4\7\20\2\2\u00a4\u00a5\5&\24\2\u00a5\u00a7\3\2\2\2\u00a6"+
+               
"\u009b\3\2\2\2\u00a6\u009f\3\2\2\2\u00a7\35\3\2\2\2\u00a8\u00aa\5 \21"+
+               
"\2\u00a9\u00a8\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa\u00b4\3\2\2\2\u00ab\u00b5"+
+               
"\7\7\2\2\u00ac\u00b5\7\b\2\2\u00ad\u00b5\7\t\2\2\u00ae\u00b5\7\n\2\2\u00af"+
+               
"\u00b5\7\13\2\2\u00b0\u00b5\7\f\2\2\u00b1\u00b5\7\r\2\2\u00b2\u00b5\7"+
+               
"\16\2\2\u00b3\u00b5\5*\26\2\u00b4\u00ab\3\2\2\2\u00b4\u00ac\3\2\2\2\u00b4"+
+               
"\u00ad\3\2\2\2\u00b4\u00ae\3\2\2\2\u00b4\u00af\3\2\2\2\u00b4\u00b0\3\2"+
+               
"\2\2\u00b4\u00b1\3\2\2\2\u00b4\u00b2\3\2\2\2\u00b4\u00b3\3\2\2\2\u00b5"+
+               
"\37\3\2\2\2\u00b6\u00b7\b\21\1\2\u00b7\u00b8\5\"\22\2\u00b8\u00bd\3\2"+
+               
"\2\2\u00b9\u00ba\f\3\2\2\u00ba\u00bc\5\"\22\2\u00bb\u00b9\3\2\2\2\u00bc"+
+               
"\u00bf\3\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be!\3\2\2\2"+
+               
"\u00bf\u00bd\3\2\2\2\u00c0\u00c1\7*\2\2\u00c1\u00c2\7!\2\2\u00c2#\3\2"+
+               "\2\2\u00c3\u00cf\7\17\2\2\u00c4\u00c6\7 
\2\2\u00c5\u00c4\3\2\2\2\u00c5"+
+               
"\u00c6\3\2\2\2\u00c6\u00ca\3\2\2\2\u00c7\u00cb\7(\2\2\u00c8\u00c9\7(\2"+
+               
"\2\u00c9\u00cb\7)\2\2\u00ca\u00c7\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb\u00cf"+
+               
"\3\2\2\2\u00cc\u00cf\7\'\2\2\u00cd\u00cf\5,\27\2\u00ce\u00c3\3\2\2\2\u00ce"+
+               
"\u00c5\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cd\3\2\2\2\u00cf%\3\2\2\2"+
+               
"\u00d0\u00d6\5$\23\2\u00d1\u00d2\7\25\2\2\u00d2\u00d3\5(\25\2\u00d3\u00d4"+
+               
"\7\26\2\2\u00d4\u00d6\3\2\2\2\u00d5\u00d0\3\2\2\2\u00d5\u00d1\3\2\2\2"+
+               
"\u00d6\'\3\2\2\2\u00d7\u00d8\b\25\1\2\u00d8\u00d9\5$\23\2\u00d9\u00df"+
+               
"\3\2\2\2\u00da\u00db\f\3\2\2\u00db\u00dc\7\36\2\2\u00dc\u00de\5$\23\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\32\2\2\u00e3"+
+               
"\u00f0\7*\2\2\u00e4\u00e5\7\32\2\2\u00e5\u00e6\7*\2\2\u00e6\u00e7\7\34"+
+               
"\2\2\u00e7\u00e8\7(\2\2\u00e8\u00f0\7\35\2\2\u00e9\u00ea\7\32\2\2\u00ea"+
+               
"\u00eb\7*\2\2\u00eb\u00ec\7\34\2\2\u00ec\u00ed\5,\27\2\u00ed\u00ee\7\35"+
+               
"\2\2\u00ee\u00f0\3\2\2\2\u00ef\u00e2\3\2\2\2\u00ef\u00e4\3\2\2\2\u00ef"+
+               
"\u00e9\3\2\2\2\u00f0+\3\2\2\2\u00f1\u00f5\7\31\2\2\u00f2\u00f4\n\4\2\2"+
+               
"\u00f3\u00f2\3\2\2\2\u00f4\u00f7\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6"+
+               
"\3\2\2\2\u00f6\u00f8\3\2\2\2\u00f7\u00f5\3\2\2\2\u00f8\u00f9\7\31\2\2"+
+               
"\u00f9-\3\2\2\2\u00fa\u00fd\5\60\31\2\u00fb\u00fd\5\62\32\2\u00fc\u00fa"+
+               
"\3\2\2\2\u00fc\u00fb\3\2\2\2\u00fd/\3\2\2\2\u00fe\u00ff\t\5\2\2\u00ff"+
+               
"\61\3\2\2\2\u0100\u0101\7\34\2\2\u0101\u0102\7(\2\2\u0102\u0103\7\36\2"+
+               
"\2\u0103\u0104\7(\2\2\u0104\u0105\7\35\2\2\u0105\63\3\2\2\2\32\669NUZ"+
+               
"aku|\u0083\u0091\u0098\u00a6\u00a9\u00b4\u00bd\u00c5\u00ca\u00ce\u00d5"+
+               "\u00df\u00ef\u00f5\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/antlr4/NCIntentDslVisitor.java
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslVisitor.java
deleted file mode 100644
index b9b45c6..0000000
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslVisitor.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Generated from 
/Users/xxx/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
 by ANTLR 4.8
-package org.apache.nlpcraft.model.intent.impl.antlr4;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-
-/**
- * This interface defines a complete generic visitor for a parse tree produced
- * by {@link NCIntentDslParser}.
- *
- * @param <T> The return type of the visit operation. Use {@link Void} for
- * operations with no return type.
- */
-public interface NCIntentDslVisitor<T> extends ParseTreeVisitor<T> {
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#intent}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitIntent(NCIntentDslParser.IntentContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#intentId}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitIntentId(NCIntentDslParser.IntentIdContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#convDecl}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitConvDecl(NCIntentDslParser.ConvDeclContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#orderedDecl}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#flowDecl}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#flow}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitFlow(NCIntentDslParser.FlowContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#flowItem}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitFlowItem(NCIntentDslParser.FlowItemContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#flowItemIds}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitFlowItemIds(NCIntentDslParser.FlowItemIdsContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#idList}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitIdList(NCIntentDslParser.IdListContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#terms}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitTerms(NCIntentDslParser.TermsContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#term}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitTerm(NCIntentDslParser.TermContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#termId}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitTermId(NCIntentDslParser.TermIdContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#item}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitItem(NCIntentDslParser.ItemContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#predicate}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitPredicate(NCIntentDslParser.PredicateContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#lval}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitLval(NCIntentDslParser.LvalContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#lvalQual}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitLvalQual(NCIntentDslParser.LvalQualContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#lvalPart}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitLvalPart(NCIntentDslParser.LvalPartContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#rvalSingle}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitRvalSingle(NCIntentDslParser.RvalSingleContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#rval}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitRval(NCIntentDslParser.RvalContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#rvalList}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitRvalList(NCIntentDslParser.RvalListContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#meta}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitMeta(NCIntentDslParser.MetaContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#qstring}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitQstring(NCIntentDslParser.QstringContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#minMax}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitMinMax(NCIntentDslParser.MinMaxContext ctx);
-       /**
-        * Visit a parse tree produced by {@link 
NCIntentDslParser#minMaxShortcut}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx);
-       /**
-        * Visit a parse tree produced by {@link NCIntentDslParser#minMaxRange}.
-        * @param ctx the parse tree
-        * @return the visitor result
-        */
-       T visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx);
-}
\ No newline at end of file
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
index 945439f..3274edf 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslIntent.scala
@@ -20,7 +20,7 @@ package org.apache.nlpcraft.model.intent.utils
 /**
  * Intent from intent DSL.
  */
-case class NCDslIntent(id: String, conv: Boolean, ordered: Boolean, flow: 
Array[NCDslFlowItem], terms: Array[NCDslTerm]) {
+case class NCDslIntent(id: String, ordered: Boolean, flow: 
Array[NCDslFlowItem], terms: Array[NCDslTerm]) {
     if (id == null)
         throw new IllegalArgumentException("Intent ID must be provided.")
     if (terms.length == 0)
@@ -35,13 +35,12 @@ case class NCDslIntent(id: String, conv: Boolean, ordered: 
Boolean, flow: Array[
      * @return Full intent string representation in text DSL format.
      */
     def toDslString: String = {
-        val convStr = if (conv) "" else " conv=false"
         val orderedStr = if (!ordered) "" else " ordered=true"
         val flowStr = flow.mkString(" >> ") match {
             case s: String if s.nonEmpty ⇒ s" flow=$s"
             case _ ⇒ ""
         }
 
-        s"intent=$id$convStr$orderedStr$flowStr ${terms.mkString(" ")}"
+        s"intent=$id$orderedStr$flowStr ${terms.mkString(" ")}"
     }
 }
diff --git 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
index 6ed04a6..a15e400 100644
--- 
a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
+++ 
b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTerm.java
@@ -28,6 +28,9 @@ public class NCDslTerm implements Serializable {
     // Term's predicate.
     final private Function<NCToken, Boolean> pred;
 
+    // Conversational or not.
+    final private boolean conv;
+
     // Terms quantifiers.
     final private int min, max;
 
@@ -41,8 +44,9 @@ public class NCDslTerm implements Serializable {
      * @param pred Token predicate.
      * @param min Minimum quantifier for the predicate (inclusive).
      * @param max Maximum quantifier for the predicate (inclusive).
+     * @param conv Whether or not this term is conversational.
      */
-    public NCDslTerm(String id, Function<NCToken, Boolean> pred, int min, int 
max) {
+    public NCDslTerm(String id, Function<NCToken, Boolean> pred, int min, int 
max, boolean conv) {
         if (pred == null)
             throw new IllegalArgumentException("Intent DSL term predicate 
cannot be null.");
         if (min < 0 || min > max)
@@ -56,6 +60,7 @@ public class NCDslTerm implements Serializable {
         this.pred = pred;
         this.min = min;
         this.max = max;
+        this.conv = conv;
     }
 
     /**
@@ -94,6 +99,13 @@ public class NCDslTerm implements Serializable {
         return max;
     }
 
+    /**
+     * Whether or not this term support conversational context.
+     *
+     * @return {@code true} if this term supports conversational context, 
{@code false} otherwise.
+     */
+    public boolean isConversational() { return conv; }
+
     @Override
     public String toString() {
         String minMax;
@@ -109,9 +121,11 @@ public class NCDslTerm implements Serializable {
         else
             minMax = String.format("[%d,%d]", min, max);
 
+        String eq = conv ? "~" : "=";
+
         if (id == null)
-            return String.format("term={%s}%s", pred, minMax);
+            return String.format("term%s{%s}%s", eq, pred, minMax);
         else
-            return String.format("term(%s)={%s}%s", id, pred, minMax);
+            return String.format("term(%s)%s{%s}%s", eq, id, pred, minMax);
     }
 }
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
index 5b3804a..e98558c 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/NCIntentSampleSpec.scala
@@ -23,7 +23,7 @@ class NCIntentSampleSpecModel extends NCModelAdapter(
             override def getId: String = id
         }
 
-    @NCIntent("intent=intent1 term={id=='x1'}")
+    @NCIntent("intent=intent1 term~{id=='x1'}")
     @NCIntentSample(Array("x1", "x1"))
     @NCIntentSample(Array("unknown", "unknown"))
     private def onX1(ctx: NCIntentMatch): NCResult = "OK"
@@ -31,7 +31,7 @@ class NCIntentSampleSpecModel extends NCModelAdapter(
     @NCIntentSample(Array("x1", "x2", "x3"))
     @NCIntentSample(Array("x1", "x2"))
     @NCIntentSample(Array("x1"))
-    @NCIntent("intent=intent2 term={id=='x2'}")
+    @NCIntent("intent=intent2 term~{id=='x2'}")
     private def onX2(ctx: NCIntentMatch): NCResult = "OK"
 }
 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
index fb042c5..6c6869e 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/conversation/NCConversationTimeoutSpec.scala
@@ -54,7 +54,7 @@ class NCTimeoutSpecModel extends NCModel {
             }
         )
 
-    @NCIntent("intent=req conv=true term={id == 'test'}")
+    @NCIntent("intent=req term~{id == 'test'}")
     def onMatch(ctx: NCIntentMatch): NCResult = {
         val conv = ctx.getContext.getConversation
 
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
index d0a0eaa..ae76150 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/dsl_test_model.yaml
@@ -52,4 +52,4 @@ elements:
       - "{fourth|4th} ^^[alias4](id == 'a3')^^"
 
 intents:
-  - "intent=i1 conv=false term(t1)={id == 'a' && ~txt == 'x'}"
+  - "intent=i1 term(t1)={id == 'a' && ~txt == 'x'}"
diff --git 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
index 5325077..a9ebe86 100644
--- 
a/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
+++ 
b/nlpcraft/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModel.scala
@@ -44,15 +44,15 @@ class NCStmTestModel extends 
NCModelAdapter("nlpcraft.stm.test", "STM Test Model
             override def getGroups: util.List[String] = groups.asJava
         }
 
-    @NCIntent("intent=sale term={id=='sale'}")
+    @NCIntent("intent=sale term~{id=='sale'}")
     private def onSale(ctx: NCIntentMatch): NCResult = "sale"
 
-    @NCIntent("intent=buy term={id=='buy'}")
+    @NCIntent("intent=buy term~{id=='buy'}")
     private def onBuy(ctx: NCIntentMatch): NCResult = "buy"
 
-    @NCIntent("intent=sale_best_employee term={id=='sale'} 
term={id=='best_employee'}")
+    @NCIntent("intent=sale_best_employee term~{id=='sale'} 
term~{id=='best_employee'}")
     private def onBestEmployeeSale(ctx: NCIntentMatch): NCResult = 
"sale_best_employee"
 
-    @NCIntent("intent=buy_best_employee term={id=='buy'} 
term={id=='best_employee'}")
+    @NCIntent("intent=buy_best_employee term~{id=='buy'} 
term~{id=='best_employee'}")
     private def onBestEmployeeBuy(ctx: NCIntentMatch): NCResult = 
"buy_best_employee"
 }

Reply via email to