You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2021/02/02 01:43:09 UTC

[incubator-nlpcraft] branch NLPCRAFT-206 created (now 5a05217)

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

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


      at 5a05217  WIP.

This branch includes the following new commits:

     new 5a05217  WIP.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-nlpcraft] 01/01: WIP.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5a052178ebda956a912a06d9caa7ce5734bf0cab
Author: Aaron Radzinski <ar...@datalingvo.com>
AuthorDate: Mon Feb 1 17:42:58 2021 -0800

    WIP.
---
 .../org/apache/nlpcraft/model/NCMetadata.java      |    4 +-
 .../org/apache/nlpcraft/model/NCModelView.java     |    5 +-
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   96 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   35 +-
 .../model/intent/impl/antlr4/NCIntentDsl.tokens    |  139 +-
 .../impl/antlr4/NCIntentDslBaseListener.java       |   94 +-
 .../intent/impl/antlr4/NCIntentDslLexer.interp     |   20 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java |  253 ++--
 .../intent/impl/antlr4/NCIntentDslLexer.tokens     |  139 +-
 .../intent/impl/antlr4/NCIntentDslListener.java    |  116 +-
 .../intent/impl/antlr4/NCIntentDslParser.java      | 1471 +++++++++++++-------
 .../model/intent/utils/NCDslTokenPredicate.java    |    2 +-
 .../mgrs/model/NCModelSynonymDslCompiler.scala     |    1 -
 .../probe/mgrs/model/antlr4/NCSynonymDsl.g4        |   69 +-
 .../probe/mgrs/model/antlr4/NCSynonymDsl.interp    |   31 +-
 .../probe/mgrs/model/antlr4/NCSynonymDsl.tokens    |   96 +-
 .../model/antlr4/NCSynonymDslBaseListener.java     |   46 +-
 .../mgrs/model/antlr4/NCSynonymDslLexer.interp     |   19 +-
 .../probe/mgrs/model/antlr4/NCSynonymDslLexer.java |  181 +--
 .../mgrs/model/antlr4/NCSynonymDslLexer.tokens     |   96 +-
 .../mgrs/model/antlr4/NCSynonymDslListener.java    |   76 +-
 .../mgrs/model/antlr4/NCSynonymDslParser.java      | 1008 ++++++++------
 22 files changed, 2431 insertions(+), 1566 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java
index 092393b..da98c83 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCMetadata.java
@@ -21,14 +21,14 @@ import org.apache.nlpcraft.common.*;
 import java.util.*;
 
 /**
- * Provides support for map-based metadata.
+ * Provides support for mutable map-based metadata.
  * <p>
  * Read full documentation in <a target=_ href="https://nlpcraft.apache.org/data-model.html">Data Model</a> section and review
  * <a target=_ href="https://github.com/apache/incubator-nlpcraft/tree/master/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/">examples</a>.
  */
 public interface NCMetadata {
     /**
-     * Gets metadata.
+     * Gets mutable metadata.
      *
      * @return Metadata.
      * @see #meta(String)
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
index f82a0ce..a58787b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCModelView.java
@@ -676,7 +676,8 @@ public interface NCModelView extends NCMetadata {
     /**
      * Gets optional user defined model metadata that can be set by the developer and accessed later.
      * By default returns an empty map. Note that this metadata is different from the one returned
-     * by {@link NCToken#getMetadata()} method.
+     * by {@link NCToken#getMetadata()} method. Note also that this metadata is mutable and can be
+     * changed at runtime by the model's code.
      * <p>
      * <b>JSON</b>
      * <br>
@@ -691,7 +692,7 @@ public interface NCModelView extends NCMetadata {
      * }
      * </pre>
      *
-     * @return Optional user defined model metadata. TODO: cannot be null
+     * @return Optional user defined model metadata. Can be empty but never {@code null}.
      */
     default Map<String, Object> getMetadata() {
         return DFLT_METADATA;
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 7580c56..1418b8d 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,52 +17,100 @@
 
 grammar NCIntentDsl;
 
-intent: intentId orderedDecl? flowDecl? terms EOF;
+intent: intentId orderedDecl? flowDecl? metaDecl? terms EOF;
 intentId: 'intent' EQ ID;
 orderedDecl: 'ordered' EQ BOOL;
 flowDecl: 'flow' EQ qstring;
+metaDecl: 'meta' EQ LCURLY metaList? RCURLY;
+metaList
+    : metaItem
+    | metaList COMMA metaItem
+    ;
+metaItem: qstring COLON metaItemRval;
+metaItemRval
+    : 'null'
+    | BOOL
+    | qstring
+    ;
 terms: term | terms term;
-termEq: EQ | TILDA;
+termEq
+    : EQ // Do not use conversation.
+    | TILDA // Use conversation.
+    ;
 term: 'term' termId? termEq LCURLY item RCURLY minMax?;
 termId: LPAREN ID RPAREN;
 item
-    : predicate
+    : pred
     | LPAREN item RPAREN
     | item (AND | OR) item
     | EXCL item
     ;
-predicate
-    : lval PRED_OP rval
-    | ID LPAREN lval RPAREN PRED_OP rval  // Function call.
+pred: expr PRED_OP expr;
+expr
+    : val
+    | ID LPAREN expr RPAREN // Buit-in function call.
+    ;
+val
+    : singleVal
+    | LPAREN val RPAREN
+    | val COMMA val
     ;
-lval: lvalQual? ('id' | 'aliases' | 'startidx' | 'endidx' | 'parent' | 'groups' | 'ancestors' | 'value' | meta);
-lvalQual: lvalPart | lvalQual lvalPart;
-lvalPart: ID DOT;
-rvalSingle
+singleVal
     : 'null'
     | MINUS? (INT | INT EXP)
     | BOOL
     | qstring
+    | tokQual? ('id' | 'aliases' | 'startidx' | 'endidx' | 'parent' | 'groups' | 'ancestors' | 'value')
+    | tokQual? tokMeta
+    | modelMeta
+    | intentMeta
     ;
-rval
-    : rvalSingle
-    | LPAREN rvalList RPAREN
+tokQual
+    : tokQualPart
+    | tokQual tokQualPart
     ;
-rvalList
-    : rvalSingle
-    | rvalList COMMA rvalSingle
-    ;
-meta
+tokQualPart: ID DOT;
+tokMeta // Token metadata: ~prop
     : TILDA ID
     | TILDA ID LBR INT RBR
     | TILDA ID LBR qstring RBR
     ;
-qstring: QSTRING;
-minMax: minMaxShortcut | minMaxRange;
-minMaxShortcut: PLUS | QUESTION | STAR;
+modelMeta // Model metadata: #prop
+    : POUND ID
+    | POUND ID LBR INT RBR
+    | POUND ID LBR qstring RBR
+    ;
+intentMeta // Intent metadata: $prop
+    : DOLLAR ID
+    | DOLLAR ID LBR INT RBR
+    | DOLLAR ID LBR qstring RBR
+    ;
+qstring
+    : SQSTRING
+    | DQSTRING
+    ;
+minMax
+    : minMaxShortcut
+    | minMaxRange
+    ;
+minMaxShortcut
+    : PLUS
+    | QUESTION
+    | STAR
+    ;
 minMaxRange: LBR INT COMMA INT RBR;
-QSTRING: SQUOTE (~'\'')* SQUOTE;
-PRED_OP: '==' | '!=' | '>=' | '<=' | '>' | '<' | '@@' | '!@';
+SQSTRING: SQUOTE (~'\'')* SQUOTE;
+DQSTRING: DQUOTE (~'"')* DQUOTE;
+PRED_OP
+    : '==' // Includes regex for strings.
+    | '!=' // Includes regex for strings.
+    | '>='
+    | '<='
+    | '>'
+    | '<'
+    | '@@' // Set or string containment.
+    | '!@' // Set or string not containment.
+    ;
 AND: '&&';
 OR: '||';
 VERT: '|';
@@ -72,10 +120,12 @@ RPAREN: ')';
 LCURLY: '{';
 RCURLY: '}';
 SQUOTE: '\'';
+DQUOTE: '"';
 TILDA: '~';
 RIGHT: '>>';
 LBR: '[';
 RBR: ']';
+POUND: '#';
 COMMA: ',';
 COLON: ':';
 MINUS: '-';
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 b4de53e..bc20478 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
@@ -3,6 +3,8 @@ null
 'intent'
 'ordered'
 'flow'
+'meta'
+'null'
 'term'
 'id'
 'aliases'
@@ -12,7 +14,7 @@ null
 'groups'
 'ancestors'
 'value'
-'null'
+null
 null
 null
 '&&'
@@ -24,10 +26,12 @@ null
 '{'
 '}'
 '\''
+'"'
 '~'
 '>>'
 '['
 ']'
+'#'
 ','
 ':'
 '-'
@@ -61,7 +65,9 @@ null
 null
 null
 null
-QSTRING
+null
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -72,10 +78,12 @@ RPAREN
 LCURLY
 RCURLY
 SQUOTE
+DQUOTE
 TILDA
 RIGHT
 LBR
 RBR
+POUND
 COMMA
 COLON
 MINUS
@@ -99,19 +107,24 @@ intent
 intentId
 orderedDecl
 flowDecl
+metaDecl
+metaList
+metaItem
+metaItemRval
 terms
 termEq
 term
 termId
 item
-predicate
-lval
-lvalQual
-lvalPart
-rvalSingle
-rval
-rvalList
-meta
+pred
+expr
+val
+singleVal
+tokQual
+tokQualPart
+tokMeta
+modelMeta
+intentMeta
 qstring
 minMax
 minMaxShortcut
@@ -119,4 +132,4 @@ minMaxRange
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 47, 212, 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, 3, 2, 3, 2, 5, 2, 47, 10, 2, 3, 2, 5, 2, 50, 10, 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,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 51, 276, 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, 3, 2, 3, 2, 5, 2, 57, 10, 2, 3, 2, 5, 2, 60, 10, 2, 3, 2, 5, 2, 63, 10,  [...]
\ 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 c14c264..5175019 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,72 +11,79 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-QSTRING=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
-DOLLAR=38
-POWER=39
-BOOL=40
-INT=41
-EXP=42
-ID=43
-WS=44
-ErrorCharacter=45
+T__13=14
+SQSTRING=15
+DQSTRING=16
+PRED_OP=17
+AND=18
+OR=19
+VERT=20
+EXCL=21
+LPAREN=22
+RPAREN=23
+LCURLY=24
+RCURLY=25
+SQUOTE=26
+DQUOTE=27
+TILDA=28
+RIGHT=29
+LBR=30
+RBR=31
+POUND=32
+COMMA=33
+COLON=34
+MINUS=35
+DOT=36
+UNDERSCORE=37
+EQ=38
+PLUS=39
+QUESTION=40
+STAR=41
+DOLLAR=42
+POWER=43
+BOOL=44
+INT=45
+EXP=46
+ID=47
+WS=48
+ErrorCharacter=49
 'intent'=1
 'ordered'=2
 'flow'=3
-'term'=4
-'id'=5
-'aliases'=6
-'startidx'=7
-'endidx'=8
-'parent'=9
-'groups'=10
-'ancestors'=11
-'value'=12
-'null'=13
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
-'$'=38
-'^'=39
+'meta'=4
+'null'=5
+'term'=6
+'id'=7
+'aliases'=8
+'startidx'=9
+'endidx'=10
+'parent'=11
+'groups'=12
+'ancestors'=13
+'value'=14
+'&&'=18
+'||'=19
+'|'=20
+'!'=21
+'('=22
+')'=23
+'{'=24
+'}'=25
+'\''=26
+'"'=27
+'~'=28
+'>>'=29
+'['=30
+']'=31
+'#'=32
+','=33
+':'=34
+'-'=35
+'.'=36
+'_'=37
+'='=38
+'+'=39
+'?'=40
+'*'=41
+'$'=42
+'^'=43
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 cf22077..a6d7267 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 C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
@@ -64,6 +64,54 @@ public class NCIntentDslBaseListener implements NCIntentDslListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
+	@Override public void enterMetaDecl(NCIntentDslParser.MetaDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetaDecl(NCIntentDslParser.MetaDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterMetaList(NCIntentDslParser.MetaListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetaList(NCIntentDslParser.MetaListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterMetaItem(NCIntentDslParser.MetaItemContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetaItem(NCIntentDslParser.MetaItemContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterMetaItemRval(NCIntentDslParser.MetaItemRvalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetaItemRval(NCIntentDslParser.MetaItemRvalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
 	@Override public void enterTerms(NCIntentDslParser.TermsContext ctx) { }
 	/**
 	 * {@inheritDoc}
@@ -124,97 +172,109 @@ public class NCIntentDslBaseListener implements NCIntentDslListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterPredicate(NCIntentDslParser.PredicateContext ctx) { }
+	@Override public void enterPred(NCIntentDslParser.PredContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitPred(NCIntentDslParser.PredContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterExpr(NCIntentDslParser.ExprContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitPredicate(NCIntentDslParser.PredicateContext ctx) { }
+	@Override public void exitExpr(NCIntentDslParser.ExprContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLval(NCIntentDslParser.LvalContext ctx) { }
+	@Override public void enterVal(NCIntentDslParser.ValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLval(NCIntentDslParser.LvalContext ctx) { }
+	@Override public void exitVal(NCIntentDslParser.ValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLvalQual(NCIntentDslParser.LvalQualContext ctx) { }
+	@Override public void enterSingleVal(NCIntentDslParser.SingleValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLvalQual(NCIntentDslParser.LvalQualContext ctx) { }
+	@Override public void exitSingleVal(NCIntentDslParser.SingleValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLvalPart(NCIntentDslParser.LvalPartContext ctx) { }
+	@Override public void enterTokQual(NCIntentDslParser.TokQualContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLvalPart(NCIntentDslParser.LvalPartContext ctx) { }
+	@Override public void exitTokQual(NCIntentDslParser.TokQualContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRvalSingle(NCIntentDslParser.RvalSingleContext ctx) { }
+	@Override public void enterTokQualPart(NCIntentDslParser.TokQualPartContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRvalSingle(NCIntentDslParser.RvalSingleContext ctx) { }
+	@Override public void exitTokQualPart(NCIntentDslParser.TokQualPartContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRval(NCIntentDslParser.RvalContext ctx) { }
+	@Override public void enterTokMeta(NCIntentDslParser.TokMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRval(NCIntentDslParser.RvalContext ctx) { }
+	@Override public void exitTokMeta(NCIntentDslParser.TokMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRvalList(NCIntentDslParser.RvalListContext ctx) { }
+	@Override public void enterModelMeta(NCIntentDslParser.ModelMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRvalList(NCIntentDslParser.RvalListContext ctx) { }
+	@Override public void exitModelMeta(NCIntentDslParser.ModelMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterMeta(NCIntentDslParser.MetaContext ctx) { }
+	@Override public void enterIntentMeta(NCIntentDslParser.IntentMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitMeta(NCIntentDslParser.MetaContext ctx) { }
+	@Override public void exitIntentMeta(NCIntentDslParser.IntentMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
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 bd9d83c..ee91550 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
@@ -3,6 +3,8 @@ null
 'intent'
 'ordered'
 'flow'
+'meta'
+'null'
 'term'
 'id'
 'aliases'
@@ -12,7 +14,7 @@ null
 'groups'
 'ancestors'
 'value'
-'null'
+null
 null
 null
 '&&'
@@ -24,10 +26,12 @@ null
 '{'
 '}'
 '\''
+'"'
 '~'
 '>>'
 '['
 ']'
+'#'
 ','
 ':'
 '-'
@@ -61,7 +65,9 @@ null
 null
 null
 null
-QSTRING
+null
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -72,10 +78,12 @@ RPAREN
 LCURLY
 RCURLY
 SQUOTE
+DQUOTE
 TILDA
 RIGHT
 LBR
 RBR
+POUND
 COMMA
 COLON
 MINUS
@@ -108,7 +116,9 @@ T__9
 T__10
 T__11
 T__12
-QSTRING
+T__13
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -119,10 +129,12 @@ RPAREN
 LCURLY
 RCURLY
 SQUOTE
+DQUOTE
 TILDA
 RIGHT
 LBR
 RBR
+POUND
 COMMA
 COLON
 MINUS
@@ -149,4 +161,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 47, 306, 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, 51, 332, 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 64cc3f6..dd551a5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
@@ -11,18 +11,18 @@ import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslLexer extends Lexer {
-	static { RuntimeMetaData.checkVersion("4.9", RuntimeMetaData.VERSION); }
+	static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
 
 	protected static final DFA[] _decisionToDFA;
 	protected static final PredictionContextCache _sharedContextCache =
 		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, QSTRING=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, DOLLAR=38, POWER=39, 
-		BOOL=40, INT=41, EXP=42, ID=43, WS=44, ErrorCharacter=45;
+		T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, SQSTRING=15, DQSTRING=16, 
+		PRED_OP=17, AND=18, OR=19, VERT=20, EXCL=21, LPAREN=22, RPAREN=23, LCURLY=24, 
+		RCURLY=25, SQUOTE=26, DQUOTE=27, TILDA=28, RIGHT=29, LBR=30, RBR=31, POUND=32, 
+		COMMA=33, COLON=34, MINUS=35, DOT=36, UNDERSCORE=37, EQ=38, PLUS=39, QUESTION=40, 
+		STAR=41, DOLLAR=42, POWER=43, BOOL=44, INT=45, EXP=46, ID=47, WS=48, ErrorCharacter=49;
 	public static String[] channelNames = {
 		"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
 	};
@@ -34,32 +34,34 @@ 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", "QSTRING", "PRED_OP", "AND", "OR", 
-			"VERT", "EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", 
-			"RIGHT", "LBR", "RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", 
-			"EQ", "PLUS", "QUESTION", "STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", 
-			"ID", "WS", "ErrorCharacter"
+			"T__9", "T__10", "T__11", "T__12", "T__13", "SQSTRING", "DQSTRING", "PRED_OP", 
+			"AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", 
+			"SQUOTE", "DQUOTE", "TILDA", "RIGHT", "LBR", "RBR", "POUND", "COMMA", 
+			"COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", "STAR", 
+			"DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
-			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
-			"'null'", null, null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
-			"'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", 
-			"'_'", "'='", "'+'", "'?'", "'*'", "'$'", "'^'"
+			null, "'intent'", "'ordered'", "'flow'", "'meta'", "'null'", "'term'", 
+			"'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", 
+			"'ancestors'", "'value'", null, 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, "QSTRING", "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", 
-			"RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", 
-			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", 
-			"STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
+			null, null, null, "SQSTRING", "DQSTRING", "PRED_OP", "AND", "OR", "VERT", 
+			"EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "DQUOTE", "TILDA", 
+			"RIGHT", "LBR", "RBR", "POUND", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", 
+			"EQ", "PLUS", "QUESTION", "STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", 
+			"ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -121,105 +123,116 @@ 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/\u0132\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,\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\7\17\u00b7\n\17\f\17\16\17\u00ba"+
-		"\13\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\u00cb\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)\3)\3)\3)\3)\5)\u0109"+
-		"\n)\3*\3*\3*\7*\u010e\n*\f*\16*\u0111\13*\5*\u0113\n*\3+\3+\6+\u0117\n"+
-		"+\r+\16+\u0118\3,\3,\6,\u011d\n,\r,\16,\u011e\3,\3,\3,\3,\7,\u0125\n,"+
-		"\f,\16,\u0128\13,\3-\6-\u012b\n-\r-\16-\u012c\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-Y.[/\3\2\n\3\2))\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\u0143\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\2"+
-		"Y\3\2\2\2\2[\3\2\2\2\3]\3\2\2\2\5d\3\2\2\2\7l\3\2\2\2\tq\3\2\2\2\13v\3"+
-		"\2\2\2\ry\3\2\2\2\17\u0081\3\2\2\2\21\u008a\3\2\2\2\23\u0091\3\2\2\2\25"+
-		"\u0098\3\2\2\2\27\u009f\3\2\2\2\31\u00a9\3\2\2\2\33\u00af\3\2\2\2\35\u00b4"+
-		"\3\2\2\2\37\u00ca\3\2\2\2!\u00cc\3\2\2\2#\u00cf\3\2\2\2%\u00d2\3\2\2\2"+
-		"\'\u00d4\3\2\2\2)\u00d6\3\2\2\2+\u00d8\3\2\2\2-\u00da\3\2\2\2/\u00dc\3"+
-		"\2\2\2\61\u00de\3\2\2\2\63\u00e0\3\2\2\2\65\u00e2\3\2\2\2\67\u00e5\3\2"+
-		"\2\29\u00e7\3\2\2\2;\u00e9\3\2\2\2=\u00eb\3\2\2\2?\u00ed\3\2\2\2A\u00ef"+
-		"\3\2\2\2C\u00f1\3\2\2\2E\u00f3\3\2\2\2G\u00f5\3\2\2\2I\u00f7\3\2\2\2K"+
-		"\u00f9\3\2\2\2M\u00fb\3\2\2\2O\u00fd\3\2\2\2Q\u0108\3\2\2\2S\u0112\3\2"+
-		"\2\2U\u0114\3\2\2\2W\u011c\3\2\2\2Y\u012a\3\2\2\2[\u0130\3\2\2\2]^\7k"+
-		"\2\2^_\7p\2\2_`\7v\2\2`a\7g\2\2ab\7p\2\2bc\7v\2\2c\4\3\2\2\2de\7q\2\2"+
-		"ef\7t\2\2fg\7f\2\2gh\7g\2\2hi\7t\2\2ij\7g\2\2jk\7f\2\2k\6\3\2\2\2lm\7"+
-		"h\2\2mn\7n\2\2no\7q\2\2op\7y\2\2p\b\3\2\2\2qr\7v\2\2rs\7g\2\2st\7t\2\2"+
-		"tu\7o\2\2u\n\3\2\2\2vw\7k\2\2wx\7f\2\2x\f\3\2\2\2yz\7c\2\2z{\7n\2\2{|"+
-		"\7k\2\2|}\7c\2\2}~\7u\2\2~\177\7g\2\2\177\u0080\7u\2\2\u0080\16\3\2\2"+
-		"\2\u0081\u0082\7u\2\2\u0082\u0083\7v\2\2\u0083\u0084\7c\2\2\u0084\u0085"+
-		"\7t\2\2\u0085\u0086\7v\2\2\u0086\u0087\7k\2\2\u0087\u0088\7f\2\2\u0088"+
-		"\u0089\7z\2\2\u0089\20\3\2\2\2\u008a\u008b\7g\2\2\u008b\u008c\7p\2\2\u008c"+
-		"\u008d\7f\2\2\u008d\u008e\7k\2\2\u008e\u008f\7f\2\2\u008f\u0090\7z\2\2"+
-		"\u0090\22\3\2\2\2\u0091\u0092\7r\2\2\u0092\u0093\7c\2\2\u0093\u0094\7"+
-		"t\2\2\u0094\u0095\7g\2\2\u0095\u0096\7p\2\2\u0096\u0097\7v\2\2\u0097\24"+
-		"\3\2\2\2\u0098\u0099\7i\2\2\u0099\u009a\7t\2\2\u009a\u009b\7q\2\2\u009b"+
-		"\u009c\7w\2\2\u009c\u009d\7r\2\2\u009d\u009e\7u\2\2\u009e\26\3\2\2\2\u009f"+
-		"\u00a0\7c\2\2\u00a0\u00a1\7p\2\2\u00a1\u00a2\7e\2\2\u00a2\u00a3\7g\2\2"+
-		"\u00a3\u00a4\7u\2\2\u00a4\u00a5\7v\2\2\u00a5\u00a6\7q\2\2\u00a6\u00a7"+
-		"\7t\2\2\u00a7\u00a8\7u\2\2\u00a8\30\3\2\2\2\u00a9\u00aa\7x\2\2\u00aa\u00ab"+
-		"\7c\2\2\u00ab\u00ac\7n\2\2\u00ac\u00ad\7w\2\2\u00ad\u00ae\7g\2\2\u00ae"+
-		"\32\3\2\2\2\u00af\u00b0\7p\2\2\u00b0\u00b1\7w\2\2\u00b1\u00b2\7n\2\2\u00b2"+
-		"\u00b3\7n\2\2\u00b3\34\3\2\2\2\u00b4\u00b8\5\61\31\2\u00b5\u00b7\n\2\2"+
-		"\2\u00b6\u00b5\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9"+
-		"\3\2\2\2\u00b9\u00bb\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc\5\61\31\2"+
-		"\u00bc\36\3\2\2\2\u00bd\u00be\7?\2\2\u00be\u00cb\7?\2\2\u00bf\u00c0\7"+
-		"#\2\2\u00c0\u00cb\7?\2\2\u00c1\u00c2\7@\2\2\u00c2\u00cb\7?\2\2\u00c3\u00c4"+
-		"\7>\2\2\u00c4\u00cb\7?\2\2\u00c5\u00cb\t\3\2\2\u00c6\u00c7\7B\2\2\u00c7"+
-		"\u00cb\7B\2\2\u00c8\u00c9\7#\2\2\u00c9\u00cb\7B\2\2\u00ca\u00bd\3\2\2"+
-		"\2\u00ca\u00bf\3\2\2\2\u00ca\u00c1\3\2\2\2\u00ca\u00c3\3\2\2\2\u00ca\u00c5"+
-		"\3\2\2\2\u00ca\u00c6\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb \3\2\2\2\u00cc"+
-		"\u00cd\7(\2\2\u00cd\u00ce\7(\2\2\u00ce\"\3\2\2\2\u00cf\u00d0\7~\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#\2\2\u00d5(\3\2\2\2\u00d6\u00d7\7*\2\2\u00d7*\3\2\2\2\u00d8\u00d9\7"+
-		"+\2\2\u00d9,\3\2\2\2\u00da\u00db\7}\2\2\u00db.\3\2\2\2\u00dc\u00dd\7\177"+
-		"\2\2\u00dd\60\3\2\2\2\u00de\u00df\7)\2\2\u00df\62\3\2\2\2\u00e0\u00e1"+
-		"\7\u0080\2\2\u00e1\64\3\2\2\2\u00e2\u00e3\7@\2\2\u00e3\u00e4\7@\2\2\u00e4"+
-		"\66\3\2\2\2\u00e5\u00e6\7]\2\2\u00e68\3\2\2\2\u00e7\u00e8\7_\2\2\u00e8"+
-		":\3\2\2\2\u00e9\u00ea\7.\2\2\u00ea<\3\2\2\2\u00eb\u00ec\7<\2\2\u00ec>"+
-		"\3\2\2\2\u00ed\u00ee\7/\2\2\u00ee@\3\2\2\2\u00ef\u00f0\7\60\2\2\u00f0"+
-		"B\3\2\2\2\u00f1\u00f2\7a\2\2\u00f2D\3\2\2\2\u00f3\u00f4\7?\2\2\u00f4F"+
-		"\3\2\2\2\u00f5\u00f6\7-\2\2\u00f6H\3\2\2\2\u00f7\u00f8\7A\2\2\u00f8J\3"+
-		"\2\2\2\u00f9\u00fa\7,\2\2\u00faL\3\2\2\2\u00fb\u00fc\7&\2\2\u00fcN\3\2"+
-		"\2\2\u00fd\u00fe\7`\2\2\u00feP\3\2\2\2\u00ff\u0100\7v\2\2\u0100\u0101"+
-		"\7t\2\2\u0101\u0102\7w\2\2\u0102\u0109\7g\2\2\u0103\u0104\7h\2\2\u0104"+
-		"\u0105\7c\2\2\u0105\u0106\7n\2\2\u0106\u0107\7u\2\2\u0107\u0109\7g\2\2"+
-		"\u0108\u00ff\3\2\2\2\u0108\u0103\3\2\2\2\u0109R\3\2\2\2\u010a\u0113\7"+
-		"\62\2\2\u010b\u010f\t\4\2\2\u010c\u010e\t\5\2\2\u010d\u010c\3\2\2\2\u010e"+
-		"\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0113\3\2"+
-		"\2\2\u0111\u010f\3\2\2\2\u0112\u010a\3\2\2\2\u0112\u010b\3\2\2\2\u0113"+
-		"T\3\2\2\2\u0114\u0116\5A!\2\u0115\u0117\t\6\2\2\u0116\u0115\3\2\2\2\u0117"+
-		"\u0118\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119V\3\2\2\2"+
-		"\u011a\u011d\5C\"\2\u011b\u011d\t\7\2\2\u011c\u011a\3\2\2\2\u011c\u011b"+
-		"\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f"+
-		"\u0126\3\2\2\2\u0120\u0125\t\b\2\2\u0121\u0125\5=\37\2\u0122\u0125\5?"+
-		" \2\u0123\u0125\5C\"\2\u0124\u0120\3\2\2\2\u0124\u0121\3\2\2\2\u0124\u0122"+
-		"\3\2\2\2\u0124\u0123\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124\3\2\2\2\u0126"+
-		"\u0127\3\2\2\2\u0127X\3\2\2\2\u0128\u0126\3\2\2\2\u0129\u012b\t\t\2\2"+
-		"\u012a\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012a\3\2\2\2\u012c\u012d"+
-		"\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\b-\2\2\u012fZ\3\2\2\2\u0130\u0131"+
-		"\13\2\2\2\u0131\\\3\2\2\2\16\2\u00b8\u00ca\u0108\u010f\u0112\u0118\u011c"+
-		"\u011e\u0124\u0126\u012c\3\b\2\2";
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\63\u014c\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,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\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\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\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\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\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17"+
+		"\3\17\3\17\3\17\3\17\3\17\3\20\3\20\7\20\u00c4\n\20\f\20\16\20\u00c7\13"+
+		"\20\3\20\3\20\3\21\3\21\7\21\u00cd\n\21\f\21\16\21\u00d0\13\21\3\21\3"+
+		"\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\5"+
+		"\22\u00e1\n\22\3\23\3\23\3\23\3\24\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\34\3\34\3\35\3\35\3\36"+
+		"\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+\3+\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\5-\u0123\n"+
+		"-\3.\3.\3.\7.\u0128\n.\f.\16.\u012b\13.\5.\u012d\n.\3/\3/\6/\u0131\n/"+
+		"\r/\16/\u0132\3\60\3\60\6\60\u0137\n\60\r\60\16\60\u0138\3\60\3\60\3\60"+
+		"\3\60\7\60\u013f\n\60\f\60\16\60\u0142\13\60\3\61\6\61\u0145\n\61\r\61"+
+		"\16\61\u0146\3\61\3\61\3\62\3\62\2\2\63\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"+
+		"-Y.[/]\60_\61a\62c\63\3\2\13\3\2))\3\2$$\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\u015e\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\2Y\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"+
+		"\3e\3\2\2\2\5l\3\2\2\2\7t\3\2\2\2\ty\3\2\2\2\13~\3\2\2\2\r\u0083\3\2\2"+
+		"\2\17\u0088\3\2\2\2\21\u008b\3\2\2\2\23\u0093\3\2\2\2\25\u009c\3\2\2\2"+
+		"\27\u00a3\3\2\2\2\31\u00aa\3\2\2\2\33\u00b1\3\2\2\2\35\u00bb\3\2\2\2\37"+
+		"\u00c1\3\2\2\2!\u00ca\3\2\2\2#\u00e0\3\2\2\2%\u00e2\3\2\2\2\'\u00e5\3"+
+		"\2\2\2)\u00e8\3\2\2\2+\u00ea\3\2\2\2-\u00ec\3\2\2\2/\u00ee\3\2\2\2\61"+
+		"\u00f0\3\2\2\2\63\u00f2\3\2\2\2\65\u00f4\3\2\2\2\67\u00f6\3\2\2\29\u00f8"+
+		"\3\2\2\2;\u00fa\3\2\2\2=\u00fd\3\2\2\2?\u00ff\3\2\2\2A\u0101\3\2\2\2C"+
+		"\u0103\3\2\2\2E\u0105\3\2\2\2G\u0107\3\2\2\2I\u0109\3\2\2\2K\u010b\3\2"+
+		"\2\2M\u010d\3\2\2\2O\u010f\3\2\2\2Q\u0111\3\2\2\2S\u0113\3\2\2\2U\u0115"+
+		"\3\2\2\2W\u0117\3\2\2\2Y\u0122\3\2\2\2[\u012c\3\2\2\2]\u012e\3\2\2\2_"+
+		"\u0136\3\2\2\2a\u0144\3\2\2\2c\u014a\3\2\2\2ef\7k\2\2fg\7p\2\2gh\7v\2"+
+		"\2hi\7g\2\2ij\7p\2\2jk\7v\2\2k\4\3\2\2\2lm\7q\2\2mn\7t\2\2no\7f\2\2op"+
+		"\7g\2\2pq\7t\2\2qr\7g\2\2rs\7f\2\2s\6\3\2\2\2tu\7h\2\2uv\7n\2\2vw\7q\2"+
+		"\2wx\7y\2\2x\b\3\2\2\2yz\7o\2\2z{\7g\2\2{|\7v\2\2|}\7c\2\2}\n\3\2\2\2"+
+		"~\177\7p\2\2\177\u0080\7w\2\2\u0080\u0081\7n\2\2\u0081\u0082\7n\2\2\u0082"+
+		"\f\3\2\2\2\u0083\u0084\7v\2\2\u0084\u0085\7g\2\2\u0085\u0086\7t\2\2\u0086"+
+		"\u0087\7o\2\2\u0087\16\3\2\2\2\u0088\u0089\7k\2\2\u0089\u008a\7f\2\2\u008a"+
+		"\20\3\2\2\2\u008b\u008c\7c\2\2\u008c\u008d\7n\2\2\u008d\u008e\7k\2\2\u008e"+
+		"\u008f\7c\2\2\u008f\u0090\7u\2\2\u0090\u0091\7g\2\2\u0091\u0092\7u\2\2"+
+		"\u0092\22\3\2\2\2\u0093\u0094\7u\2\2\u0094\u0095\7v\2\2\u0095\u0096\7"+
+		"c\2\2\u0096\u0097\7t\2\2\u0097\u0098\7v\2\2\u0098\u0099\7k\2\2\u0099\u009a"+
+		"\7f\2\2\u009a\u009b\7z\2\2\u009b\24\3\2\2\2\u009c\u009d\7g\2\2\u009d\u009e"+
+		"\7p\2\2\u009e\u009f\7f\2\2\u009f\u00a0\7k\2\2\u00a0\u00a1\7f\2\2\u00a1"+
+		"\u00a2\7z\2\2\u00a2\26\3\2\2\2\u00a3\u00a4\7r\2\2\u00a4\u00a5\7c\2\2\u00a5"+
+		"\u00a6\7t\2\2\u00a6\u00a7\7g\2\2\u00a7\u00a8\7p\2\2\u00a8\u00a9\7v\2\2"+
+		"\u00a9\30\3\2\2\2\u00aa\u00ab\7i\2\2\u00ab\u00ac\7t\2\2\u00ac\u00ad\7"+
+		"q\2\2\u00ad\u00ae\7w\2\2\u00ae\u00af\7r\2\2\u00af\u00b0\7u\2\2\u00b0\32"+
+		"\3\2\2\2\u00b1\u00b2\7c\2\2\u00b2\u00b3\7p\2\2\u00b3\u00b4\7e\2\2\u00b4"+
+		"\u00b5\7g\2\2\u00b5\u00b6\7u\2\2\u00b6\u00b7\7v\2\2\u00b7\u00b8\7q\2\2"+
+		"\u00b8\u00b9\7t\2\2\u00b9\u00ba\7u\2\2\u00ba\34\3\2\2\2\u00bb\u00bc\7"+
+		"x\2\2\u00bc\u00bd\7c\2\2\u00bd\u00be\7n\2\2\u00be\u00bf\7w\2\2\u00bf\u00c0"+
+		"\7g\2\2\u00c0\36\3\2\2\2\u00c1\u00c5\5\65\33\2\u00c2\u00c4\n\2\2\2\u00c3"+
+		"\u00c2\3\2\2\2\u00c4\u00c7\3\2\2\2\u00c5\u00c3\3\2\2\2\u00c5\u00c6\3\2"+
+		"\2\2\u00c6\u00c8\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c8\u00c9\5\65\33\2\u00c9"+
+		" \3\2\2\2\u00ca\u00ce\5\67\34\2\u00cb\u00cd\n\3\2\2\u00cc\u00cb\3\2\2"+
+		"\2\u00cd\u00d0\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d1"+
+		"\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d1\u00d2\5\67\34\2\u00d2\"\3\2\2\2\u00d3"+
+		"\u00d4\7?\2\2\u00d4\u00e1\7?\2\2\u00d5\u00d6\7#\2\2\u00d6\u00e1\7?\2\2"+
+		"\u00d7\u00d8\7@\2\2\u00d8\u00e1\7?\2\2\u00d9\u00da\7>\2\2\u00da\u00e1"+
+		"\7?\2\2\u00db\u00e1\t\4\2\2\u00dc\u00dd\7B\2\2\u00dd\u00e1\7B\2\2\u00de"+
+		"\u00df\7#\2\2\u00df\u00e1\7B\2\2\u00e0\u00d3\3\2\2\2\u00e0\u00d5\3\2\2"+
+		"\2\u00e0\u00d7\3\2\2\2\u00e0\u00d9\3\2\2\2\u00e0\u00db\3\2\2\2\u00e0\u00dc"+
+		"\3\2\2\2\u00e0\u00de\3\2\2\2\u00e1$\3\2\2\2\u00e2\u00e3\7(\2\2\u00e3\u00e4"+
+		"\7(\2\2\u00e4&\3\2\2\2\u00e5\u00e6\7~\2\2\u00e6\u00e7\7~\2\2\u00e7(\3"+
+		"\2\2\2\u00e8\u00e9\7~\2\2\u00e9*\3\2\2\2\u00ea\u00eb\7#\2\2\u00eb,\3\2"+
+		"\2\2\u00ec\u00ed\7*\2\2\u00ed.\3\2\2\2\u00ee\u00ef\7+\2\2\u00ef\60\3\2"+
+		"\2\2\u00f0\u00f1\7}\2\2\u00f1\62\3\2\2\2\u00f2\u00f3\7\177\2\2\u00f3\64"+
+		"\3\2\2\2\u00f4\u00f5\7)\2\2\u00f5\66\3\2\2\2\u00f6\u00f7\7$\2\2\u00f7"+
+		"8\3\2\2\2\u00f8\u00f9\7\u0080\2\2\u00f9:\3\2\2\2\u00fa\u00fb\7@\2\2\u00fb"+
+		"\u00fc\7@\2\2\u00fc<\3\2\2\2\u00fd\u00fe\7]\2\2\u00fe>\3\2\2\2\u00ff\u0100"+
+		"\7_\2\2\u0100@\3\2\2\2\u0101\u0102\7%\2\2\u0102B\3\2\2\2\u0103\u0104\7"+
+		".\2\2\u0104D\3\2\2\2\u0105\u0106\7<\2\2\u0106F\3\2\2\2\u0107\u0108\7/"+
+		"\2\2\u0108H\3\2\2\2\u0109\u010a\7\60\2\2\u010aJ\3\2\2\2\u010b\u010c\7"+
+		"a\2\2\u010cL\3\2\2\2\u010d\u010e\7?\2\2\u010eN\3\2\2\2\u010f\u0110\7-"+
+		"\2\2\u0110P\3\2\2\2\u0111\u0112\7A\2\2\u0112R\3\2\2\2\u0113\u0114\7,\2"+
+		"\2\u0114T\3\2\2\2\u0115\u0116\7&\2\2\u0116V\3\2\2\2\u0117\u0118\7`\2\2"+
+		"\u0118X\3\2\2\2\u0119\u011a\7v\2\2\u011a\u011b\7t\2\2\u011b\u011c\7w\2"+
+		"\2\u011c\u0123\7g\2\2\u011d\u011e\7h\2\2\u011e\u011f\7c\2\2\u011f\u0120"+
+		"\7n\2\2\u0120\u0121\7u\2\2\u0121\u0123\7g\2\2\u0122\u0119\3\2\2\2\u0122"+
+		"\u011d\3\2\2\2\u0123Z\3\2\2\2\u0124\u012d\7\62\2\2\u0125\u0129\t\5\2\2"+
+		"\u0126\u0128\t\6\2\2\u0127\u0126\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127"+
+		"\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u012d\3\2\2\2\u012b\u0129\3\2\2\2\u012c"+
+		"\u0124\3\2\2\2\u012c\u0125\3\2\2\2\u012d\\\3\2\2\2\u012e\u0130\5I%\2\u012f"+
+		"\u0131\t\7\2\2\u0130\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\u0130\3\2"+
+		"\2\2\u0132\u0133\3\2\2\2\u0133^\3\2\2\2\u0134\u0137\5K&\2\u0135\u0137"+
+		"\t\b\2\2\u0136\u0134\3\2\2\2\u0136\u0135\3\2\2\2\u0137\u0138\3\2\2\2\u0138"+
+		"\u0136\3\2\2\2\u0138\u0139\3\2\2\2\u0139\u0140\3\2\2\2\u013a\u013f\t\t"+
+		"\2\2\u013b\u013f\5E#\2\u013c\u013f\5G$\2\u013d\u013f\5K&\2\u013e\u013a"+
+		"\3\2\2\2\u013e\u013b\3\2\2\2\u013e\u013c\3\2\2\2\u013e\u013d\3\2\2\2\u013f"+
+		"\u0142\3\2\2\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141`\3\2\2\2"+
+		"\u0142\u0140\3\2\2\2\u0143\u0145\t\n\2\2\u0144\u0143\3\2\2\2\u0145\u0146"+
+		"\3\2\2\2\u0146\u0144\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0148\3\2\2\2\u0148"+
+		"\u0149\b\61\2\2\u0149b\3\2\2\2\u014a\u014b\13\2\2\2\u014bd\3\2\2\2\17"+
+		"\2\u00c5\u00ce\u00e0\u0122\u0129\u012c\u0132\u0136\u0138\u013e\u0140\u0146"+
+		"\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 c14c264..5175019 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,72 +11,79 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-QSTRING=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
-DOLLAR=38
-POWER=39
-BOOL=40
-INT=41
-EXP=42
-ID=43
-WS=44
-ErrorCharacter=45
+T__13=14
+SQSTRING=15
+DQSTRING=16
+PRED_OP=17
+AND=18
+OR=19
+VERT=20
+EXCL=21
+LPAREN=22
+RPAREN=23
+LCURLY=24
+RCURLY=25
+SQUOTE=26
+DQUOTE=27
+TILDA=28
+RIGHT=29
+LBR=30
+RBR=31
+POUND=32
+COMMA=33
+COLON=34
+MINUS=35
+DOT=36
+UNDERSCORE=37
+EQ=38
+PLUS=39
+QUESTION=40
+STAR=41
+DOLLAR=42
+POWER=43
+BOOL=44
+INT=45
+EXP=46
+ID=47
+WS=48
+ErrorCharacter=49
 'intent'=1
 'ordered'=2
 'flow'=3
-'term'=4
-'id'=5
-'aliases'=6
-'startidx'=7
-'endidx'=8
-'parent'=9
-'groups'=10
-'ancestors'=11
-'value'=12
-'null'=13
-'&&'=16
-'||'=17
-'|'=18
-'!'=19
-'('=20
-')'=21
-'{'=22
-'}'=23
-'\''=24
-'~'=25
-'>>'=26
-'['=27
-']'=28
-','=29
-':'=30
-'-'=31
-'.'=32
-'_'=33
-'='=34
-'+'=35
-'?'=36
-'*'=37
-'$'=38
-'^'=39
+'meta'=4
+'null'=5
+'term'=6
+'id'=7
+'aliases'=8
+'startidx'=9
+'endidx'=10
+'parent'=11
+'groups'=12
+'ancestors'=13
+'value'=14
+'&&'=18
+'||'=19
+'|'=20
+'!'=21
+'('=22
+')'=23
+'{'=24
+'}'=25
+'\''=26
+'"'=27
+'~'=28
+'>>'=29
+'['=30
+']'=31
+'#'=32
+','=33
+':'=34
+'-'=35
+'.'=36
+'_'=37
+'='=38
+'+'=39
+'?'=40
+'*'=41
+'$'=42
+'^'=43
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 66e4d5a..eea29a5 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 C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
@@ -48,6 +48,46 @@ public interface NCIntentDslListener extends ParseTreeListener {
 	 */
 	void exitFlowDecl(NCIntentDslParser.FlowDeclContext ctx);
 	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#metaDecl}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetaDecl(NCIntentDslParser.MetaDeclContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#metaDecl}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetaDecl(NCIntentDslParser.MetaDeclContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#metaList}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetaList(NCIntentDslParser.MetaListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#metaList}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetaList(NCIntentDslParser.MetaListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#metaItem}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetaItem(NCIntentDslParser.MetaItemContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#metaItem}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetaItem(NCIntentDslParser.MetaItemContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#metaItemRval}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetaItemRval(NCIntentDslParser.MetaItemRvalContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#metaItemRval}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetaItemRval(NCIntentDslParser.MetaItemRvalContext ctx);
+	/**
 	 * Enter a parse tree produced by {@link NCIntentDslParser#terms}.
 	 * @param ctx the parse tree
 	 */
@@ -98,85 +138,95 @@ public interface NCIntentDslListener extends ParseTreeListener {
 	 */
 	void exitItem(NCIntentDslParser.ItemContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#predicate}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#pred}.
+	 * @param ctx the parse tree
+	 */
+	void enterPred(NCIntentDslParser.PredContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCIntentDslParser#pred}.
+	 * @param ctx the parse tree
+	 */
+	void exitPred(NCIntentDslParser.PredContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCIntentDslParser#expr}.
 	 * @param ctx the parse tree
 	 */
-	void enterPredicate(NCIntentDslParser.PredicateContext ctx);
+	void enterExpr(NCIntentDslParser.ExprContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#predicate}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#expr}.
 	 * @param ctx the parse tree
 	 */
-	void exitPredicate(NCIntentDslParser.PredicateContext ctx);
+	void exitExpr(NCIntentDslParser.ExprContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#lval}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#val}.
 	 * @param ctx the parse tree
 	 */
-	void enterLval(NCIntentDslParser.LvalContext ctx);
+	void enterVal(NCIntentDslParser.ValContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#lval}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#val}.
 	 * @param ctx the parse tree
 	 */
-	void exitLval(NCIntentDslParser.LvalContext ctx);
+	void exitVal(NCIntentDslParser.ValContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#lvalQual}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#singleVal}.
 	 * @param ctx the parse tree
 	 */
-	void enterLvalQual(NCIntentDslParser.LvalQualContext ctx);
+	void enterSingleVal(NCIntentDslParser.SingleValContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#lvalQual}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#singleVal}.
 	 * @param ctx the parse tree
 	 */
-	void exitLvalQual(NCIntentDslParser.LvalQualContext ctx);
+	void exitSingleVal(NCIntentDslParser.SingleValContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#lvalPart}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#tokQual}.
 	 * @param ctx the parse tree
 	 */
-	void enterLvalPart(NCIntentDslParser.LvalPartContext ctx);
+	void enterTokQual(NCIntentDslParser.TokQualContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#lvalPart}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#tokQual}.
 	 * @param ctx the parse tree
 	 */
-	void exitLvalPart(NCIntentDslParser.LvalPartContext ctx);
+	void exitTokQual(NCIntentDslParser.TokQualContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#rvalSingle}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#tokQualPart}.
 	 * @param ctx the parse tree
 	 */
-	void enterRvalSingle(NCIntentDslParser.RvalSingleContext ctx);
+	void enterTokQualPart(NCIntentDslParser.TokQualPartContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#rvalSingle}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#tokQualPart}.
 	 * @param ctx the parse tree
 	 */
-	void exitRvalSingle(NCIntentDslParser.RvalSingleContext ctx);
+	void exitTokQualPart(NCIntentDslParser.TokQualPartContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#rval}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#tokMeta}.
 	 * @param ctx the parse tree
 	 */
-	void enterRval(NCIntentDslParser.RvalContext ctx);
+	void enterTokMeta(NCIntentDslParser.TokMetaContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#rval}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#tokMeta}.
 	 * @param ctx the parse tree
 	 */
-	void exitRval(NCIntentDslParser.RvalContext ctx);
+	void exitTokMeta(NCIntentDslParser.TokMetaContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#rvalList}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#modelMeta}.
 	 * @param ctx the parse tree
 	 */
-	void enterRvalList(NCIntentDslParser.RvalListContext ctx);
+	void enterModelMeta(NCIntentDslParser.ModelMetaContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#rvalList}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#modelMeta}.
 	 * @param ctx the parse tree
 	 */
-	void exitRvalList(NCIntentDslParser.RvalListContext ctx);
+	void exitModelMeta(NCIntentDslParser.ModelMetaContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCIntentDslParser#meta}.
+	 * Enter a parse tree produced by {@link NCIntentDslParser#intentMeta}.
 	 * @param ctx the parse tree
 	 */
-	void enterMeta(NCIntentDslParser.MetaContext ctx);
+	void enterIntentMeta(NCIntentDslParser.IntentMetaContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCIntentDslParser#meta}.
+	 * Exit a parse tree produced by {@link NCIntentDslParser#intentMeta}.
 	 * @param ctx the parse tree
 	 */
-	void exitMeta(NCIntentDslParser.MetaContext ctx);
+	void exitIntentMeta(NCIntentDslParser.IntentMetaContext ctx);
 	/**
 	 * Enter a parse tree produced by {@link NCIntentDslParser#qstring}.
 	 * @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 dc599fe..bd52388 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.model.intent.impl.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
@@ -11,50 +11,54 @@ import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslParser extends Parser {
-	static { RuntimeMetaData.checkVersion("4.9", RuntimeMetaData.VERSION); }
+	static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
 
 	protected static final DFA[] _decisionToDFA;
 	protected static final PredictionContextCache _sharedContextCache =
 		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, QSTRING=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, DOLLAR=38, POWER=39, 
-		BOOL=40, INT=41, EXP=42, ID=43, WS=44, ErrorCharacter=45;
+		T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, SQSTRING=15, DQSTRING=16, 
+		PRED_OP=17, AND=18, OR=19, VERT=20, EXCL=21, LPAREN=22, RPAREN=23, LCURLY=24, 
+		RCURLY=25, SQUOTE=26, DQUOTE=27, TILDA=28, RIGHT=29, LBR=30, RBR=31, POUND=32, 
+		COMMA=33, COLON=34, MINUS=35, DOT=36, UNDERSCORE=37, EQ=38, PLUS=39, QUESTION=40, 
+		STAR=41, DOLLAR=42, POWER=43, BOOL=44, INT=45, EXP=46, ID=47, WS=48, ErrorCharacter=49;
 	public static final int
 		RULE_intent = 0, RULE_intentId = 1, RULE_orderedDecl = 2, RULE_flowDecl = 3, 
-		RULE_terms = 4, RULE_termEq = 5, RULE_term = 6, RULE_termId = 7, RULE_item = 8, 
-		RULE_predicate = 9, RULE_lval = 10, RULE_lvalQual = 11, RULE_lvalPart = 12, 
-		RULE_rvalSingle = 13, RULE_rval = 14, RULE_rvalList = 15, RULE_meta = 16, 
-		RULE_qstring = 17, RULE_minMax = 18, RULE_minMaxShortcut = 19, RULE_minMaxRange = 20;
+		RULE_metaDecl = 4, RULE_metaList = 5, RULE_metaItem = 6, RULE_metaItemRval = 7, 
+		RULE_terms = 8, RULE_termEq = 9, RULE_term = 10, RULE_termId = 11, RULE_item = 12, 
+		RULE_pred = 13, RULE_expr = 14, RULE_val = 15, RULE_singleVal = 16, RULE_tokQual = 17, 
+		RULE_tokQualPart = 18, RULE_tokMeta = 19, RULE_modelMeta = 20, RULE_intentMeta = 21, 
+		RULE_qstring = 22, RULE_minMax = 23, RULE_minMaxShortcut = 24, RULE_minMaxRange = 25;
 	private static String[] makeRuleNames() {
 		return new String[] {
-			"intent", "intentId", "orderedDecl", "flowDecl", "terms", "termEq", "term", 
-			"termId", "item", "predicate", "lval", "lvalQual", "lvalPart", "rvalSingle", 
-			"rval", "rvalList", "meta", "qstring", "minMax", "minMaxShortcut", "minMaxRange"
+			"intent", "intentId", "orderedDecl", "flowDecl", "metaDecl", "metaList", 
+			"metaItem", "metaItemRval", "terms", "termEq", "term", "termId", "item", 
+			"pred", "expr", "val", "singleVal", "tokQual", "tokQualPart", "tokMeta", 
+			"modelMeta", "intentMeta", "qstring", "minMax", "minMaxShortcut", "minMaxRange"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
-			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
-			"'null'", null, null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
-			"'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", 
-			"'_'", "'='", "'+'", "'?'", "'*'", "'$'", "'^'"
+			null, "'intent'", "'ordered'", "'flow'", "'meta'", "'null'", "'term'", 
+			"'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", 
+			"'ancestors'", "'value'", null, 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, "QSTRING", "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", 
-			"RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", 
-			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", 
-			"STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
+			null, null, null, "SQSTRING", "DQSTRING", "PRED_OP", "AND", "OR", "VERT", 
+			"EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "DQUOTE", "TILDA", 
+			"RIGHT", "LBR", "RBR", "POUND", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", 
+			"EQ", "PLUS", "QUESTION", "STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", 
+			"ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -122,6 +126,9 @@ public class NCIntentDslParser extends Parser {
 		public FlowDeclContext flowDecl() {
 			return getRuleContext(FlowDeclContext.class,0);
 		}
+		public MetaDeclContext metaDecl() {
+			return getRuleContext(MetaDeclContext.class,0);
+		}
 		public IntentContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -143,31 +150,41 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(42);
+			setState(52);
 			intentId();
-			setState(44);
+			setState(54);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==T__1) {
 				{
-				setState(43);
+				setState(53);
 				orderedDecl();
 				}
 			}
 
-			setState(47);
+			setState(57);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==T__2) {
 				{
-				setState(46);
+				setState(56);
 				flowDecl();
 				}
 			}
 
-			setState(49);
+			setState(60);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==T__3) {
+				{
+				setState(59);
+				metaDecl();
+				}
+			}
+
+			setState(62);
 			terms(0);
-			setState(50);
+			setState(63);
 			match(EOF);
 			}
 		}
@@ -205,11 +222,11 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(52);
+			setState(65);
 			match(T__0);
-			setState(53);
+			setState(66);
 			match(EQ);
-			setState(54);
+			setState(67);
 			match(ID);
 			}
 		}
@@ -247,11 +264,11 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(56);
+			setState(69);
 			match(T__1);
-			setState(57);
+			setState(70);
 			match(EQ);
-			setState(58);
+			setState(71);
 			match(BOOL);
 			}
 		}
@@ -291,12 +308,260 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(60);
+			setState(73);
 			match(T__2);
-			setState(61);
+			setState(74);
 			match(EQ);
-			setState(62);
+			setState(75);
+			qstring();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class MetaDeclContext extends ParserRuleContext {
+		public TerminalNode EQ() { return getToken(NCIntentDslParser.EQ, 0); }
+		public TerminalNode LCURLY() { return getToken(NCIntentDslParser.LCURLY, 0); }
+		public TerminalNode RCURLY() { return getToken(NCIntentDslParser.RCURLY, 0); }
+		public MetaListContext metaList() {
+			return getRuleContext(MetaListContext.class,0);
+		}
+		public MetaDeclContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metaDecl; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterMetaDecl(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMetaDecl(this);
+		}
+	}
+
+	public final MetaDeclContext metaDecl() throws RecognitionException {
+		MetaDeclContext _localctx = new MetaDeclContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_metaDecl);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(77);
+			match(T__3);
+			setState(78);
+			match(EQ);
+			setState(79);
+			match(LCURLY);
+			setState(81);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==SQSTRING || _la==DQSTRING) {
+				{
+				setState(80);
+				metaList(0);
+				}
+			}
+
+			setState(83);
+			match(RCURLY);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class MetaListContext extends ParserRuleContext {
+		public MetaItemContext metaItem() {
+			return getRuleContext(MetaItemContext.class,0);
+		}
+		public MetaListContext metaList() {
+			return getRuleContext(MetaListContext.class,0);
+		}
+		public TerminalNode COMMA() { return getToken(NCIntentDslParser.COMMA, 0); }
+		public MetaListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metaList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterMetaList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMetaList(this);
+		}
+	}
+
+	public final MetaListContext metaList() throws RecognitionException {
+		return metaList(0);
+	}
+
+	private MetaListContext metaList(int _p) throws RecognitionException {
+		ParserRuleContext _parentctx = _ctx;
+		int _parentState = getState();
+		MetaListContext _localctx = new MetaListContext(_ctx, _parentState);
+		MetaListContext _prevctx = _localctx;
+		int _startState = 10;
+		enterRecursionRule(_localctx, 10, RULE_metaList, _p);
+		try {
+			int _alt;
+			enterOuterAlt(_localctx, 1);
+			{
+			{
+			setState(86);
+			metaItem();
+			}
+			_ctx.stop = _input.LT(-1);
+			setState(93);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					if ( _parseListeners!=null ) triggerExitRuleEvent();
+					_prevctx = _localctx;
+					{
+					{
+					_localctx = new MetaListContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_metaList);
+					setState(88);
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(89);
+					match(COMMA);
+					setState(90);
+					metaItem();
+					}
+					} 
+				}
+				setState(95);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,4,_ctx);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			unrollRecursionContexts(_parentctx);
+		}
+		return _localctx;
+	}
+
+	public static class MetaItemContext extends ParserRuleContext {
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
+		}
+		public TerminalNode COLON() { return getToken(NCIntentDslParser.COLON, 0); }
+		public MetaItemRvalContext metaItemRval() {
+			return getRuleContext(MetaItemRvalContext.class,0);
+		}
+		public MetaItemContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metaItem; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterMetaItem(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMetaItem(this);
+		}
+	}
+
+	public final MetaItemContext metaItem() throws RecognitionException {
+		MetaItemContext _localctx = new MetaItemContext(_ctx, getState());
+		enterRule(_localctx, 12, RULE_metaItem);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(96);
 			qstring();
+			setState(97);
+			match(COLON);
+			setState(98);
+			metaItemRval();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class MetaItemRvalContext extends ParserRuleContext {
+		public TerminalNode BOOL() { return getToken(NCIntentDslParser.BOOL, 0); }
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
+		}
+		public MetaItemRvalContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metaItemRval; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterMetaItemRval(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMetaItemRval(this);
+		}
+	}
+
+	public final MetaItemRvalContext metaItemRval() throws RecognitionException {
+		MetaItemRvalContext _localctx = new MetaItemRvalContext(_ctx, getState());
+		enterRule(_localctx, 14, RULE_metaItemRval);
+		try {
+			setState(103);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case T__4:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(100);
+				match(T__4);
+				}
+				break;
+			case BOOL:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(101);
+				match(BOOL);
+				}
+				break;
+			case SQSTRING:
+			case DQSTRING:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(102);
+				qstring();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
 			}
 		}
 		catch (RecognitionException re) {
@@ -340,20 +605,20 @@ public class NCIntentDslParser extends Parser {
 		int _parentState = getState();
 		TermsContext _localctx = new TermsContext(_ctx, _parentState);
 		TermsContext _prevctx = _localctx;
-		int _startState = 8;
-		enterRecursionRule(_localctx, 8, RULE_terms, _p);
+		int _startState = 16;
+		enterRecursionRule(_localctx, 16, RULE_terms, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(65);
+			setState(106);
 			term();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(71);
+			setState(112);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,2,_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();
@@ -362,16 +627,16 @@ public class NCIntentDslParser extends Parser {
 					{
 					_localctx = new TermsContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_terms);
-					setState(67);
+					setState(108);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(68);
+					setState(109);
 					term();
 					}
 					} 
 				}
-				setState(73);
+				setState(114);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
 			}
 			}
 		}
@@ -405,12 +670,12 @@ public class NCIntentDslParser extends Parser {
 
 	public final TermEqContext termEq() throws RecognitionException {
 		TermEqContext _localctx = new TermEqContext(_ctx, getState());
-		enterRule(_localctx, 10, RULE_termEq);
+		enterRule(_localctx, 18, RULE_termEq);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(74);
+			setState(115);
 			_la = _input.LA(1);
 			if ( !(_la==TILDA || _la==EQ) ) {
 			_errHandler.recoverInline(this);
@@ -464,37 +729,37 @@ public class NCIntentDslParser extends Parser {
 
 	public final TermContext term() throws RecognitionException {
 		TermContext _localctx = new TermContext(_ctx, getState());
-		enterRule(_localctx, 12, RULE_term);
+		enterRule(_localctx, 20, RULE_term);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(76);
-			match(T__3);
-			setState(78);
+			setState(117);
+			match(T__5);
+			setState(119);
 			_errHandler.sync(this);
 			_la = _input.LA(1);
 			if (_la==LPAREN) {
 				{
-				setState(77);
+				setState(118);
 				termId();
 				}
 			}
 
-			setState(80);
+			setState(121);
 			termEq();
-			setState(81);
+			setState(122);
 			match(LCURLY);
-			setState(82);
+			setState(123);
 			item(0);
-			setState(83);
+			setState(124);
 			match(RCURLY);
-			setState(85);
+			setState(126);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
 			case 1:
 				{
-				setState(84);
+				setState(125);
 				minMax();
 				}
 				break;
@@ -532,15 +797,15 @@ public class NCIntentDslParser extends Parser {
 
 	public final TermIdContext termId() throws RecognitionException {
 		TermIdContext _localctx = new TermIdContext(_ctx, getState());
-		enterRule(_localctx, 14, RULE_termId);
+		enterRule(_localctx, 22, RULE_termId);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(87);
+			setState(128);
 			match(LPAREN);
-			setState(88);
+			setState(129);
 			match(ID);
-			setState(89);
+			setState(130);
 			match(RPAREN);
 			}
 		}
@@ -556,8 +821,8 @@ public class NCIntentDslParser extends Parser {
 	}
 
 	public static class ItemContext extends ParserRuleContext {
-		public PredicateContext predicate() {
-			return getRuleContext(PredicateContext.class,0);
+		public PredContext pred() {
+			return getRuleContext(PredContext.class,0);
 		}
 		public TerminalNode LPAREN() { return getToken(NCIntentDslParser.LPAREN, 0); }
 		public List<ItemContext> item() {
@@ -593,56 +858,45 @@ public class NCIntentDslParser extends Parser {
 		int _parentState = getState();
 		ItemContext _localctx = new ItemContext(_ctx, _parentState);
 		ItemContext _prevctx = _localctx;
-		int _startState = 16;
-		enterRecursionRule(_localctx, 16, RULE_item, _p);
+		int _startState = 24;
+		enterRecursionRule(_localctx, 24, RULE_item, _p);
 		int _la;
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(99);
+			setState(140);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__4:
-			case T__5:
-			case T__6:
-			case T__7:
-			case T__8:
-			case T__9:
-			case T__10:
-			case T__11:
-			case TILDA:
-			case ID:
+			switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
+			case 1:
 				{
-				setState(92);
-				predicate();
+				setState(133);
+				pred();
 				}
 				break;
-			case LPAREN:
+			case 2:
 				{
-				setState(93);
+				setState(134);
 				match(LPAREN);
-				setState(94);
+				setState(135);
 				item(0);
-				setState(95);
+				setState(136);
 				match(RPAREN);
 				}
 				break;
-			case EXCL:
+			case 3:
 				{
-				setState(97);
+				setState(138);
 				match(EXCL);
-				setState(98);
+				setState(139);
 				item(1);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(106);
+			setState(147);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
@@ -651,9 +905,9 @@ public class NCIntentDslParser extends Parser {
 					{
 					_localctx = new ItemContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_item);
-					setState(101);
+					setState(142);
 					if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
-					setState(102);
+					setState(143);
 					_la = _input.LA(1);
 					if ( !(_la==AND || _la==OR) ) {
 					_errHandler.recoverInline(this);
@@ -663,14 +917,14 @@ public class NCIntentDslParser extends Parser {
 						_errHandler.reportMatch(this);
 						consume();
 					}
-					setState(103);
+					setState(144);
 					item(3);
 					}
 					} 
 				}
-				setState(108);
+				setState(149);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
 			}
 			}
 		}
@@ -685,64 +939,102 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class PredicateContext extends ParserRuleContext {
-		public LvalContext lval() {
-			return getRuleContext(LvalContext.class,0);
+	public static class PredContext extends ParserRuleContext {
+		public List<ExprContext> expr() {
+			return getRuleContexts(ExprContext.class);
 		}
-		public TerminalNode PRED_OP() { return getToken(NCIntentDslParser.PRED_OP, 0); }
-		public RvalContext rval() {
-			return getRuleContext(RvalContext.class,0);
+		public ExprContext expr(int i) {
+			return getRuleContext(ExprContext.class,i);
 		}
-		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
-		public TerminalNode LPAREN() { return getToken(NCIntentDslParser.LPAREN, 0); }
-		public TerminalNode RPAREN() { return getToken(NCIntentDslParser.RPAREN, 0); }
-		public PredicateContext(ParserRuleContext parent, int invokingState) {
+		public TerminalNode PRED_OP() { return getToken(NCIntentDslParser.PRED_OP, 0); }
+		public PredContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_predicate; }
+		@Override public int getRuleIndex() { return RULE_pred; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterPredicate(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterPred(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitPredicate(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitPred(this);
 		}
 	}
 
-	public final PredicateContext predicate() throws RecognitionException {
-		PredicateContext _localctx = new PredicateContext(_ctx, getState());
-		enterRule(_localctx, 18, RULE_predicate);
+	public final PredContext pred() throws RecognitionException {
+		PredContext _localctx = new PredContext(_ctx, getState());
+		enterRule(_localctx, 26, RULE_pred);
 		try {
-			setState(120);
-			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) {
-			case 1:
-				enterOuterAlt(_localctx, 1);
-				{
-				setState(109);
-				lval();
-				setState(110);
-				match(PRED_OP);
-				setState(111);
-				rval();
-				}
-				break;
-			case 2:
-				enterOuterAlt(_localctx, 2);
-				{
-				setState(113);
-				match(ID);
-				setState(114);
-				match(LPAREN);
-				setState(115);
-				lval();
-				setState(116);
-				match(RPAREN);
-				setState(117);
-				match(PRED_OP);
-				setState(118);
-				rval();
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(150);
+			expr();
+			setState(151);
+			match(PRED_OP);
+			setState(152);
+			expr();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExprContext extends ParserRuleContext {
+		public ValContext val() {
+			return getRuleContext(ValContext.class,0);
+		}
+		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
+		public TerminalNode LPAREN() { return getToken(NCIntentDslParser.LPAREN, 0); }
+		public ExprContext expr() {
+			return getRuleContext(ExprContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(NCIntentDslParser.RPAREN, 0); }
+		public ExprContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_expr; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterExpr(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitExpr(this);
+		}
+	}
+
+	public final ExprContext expr() throws RecognitionException {
+		ExprContext _localctx = new ExprContext(_ctx, getState());
+		enterRule(_localctx, 28, RULE_expr);
+		try {
+			setState(160);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(154);
+				val(0);
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(155);
+				match(ID);
+				setState(156);
+				match(LPAREN);
+				setState(157);
+				expr();
+				setState(158);
+				match(RPAREN);
 				}
 				break;
 			}
@@ -758,104 +1050,277 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalContext extends ParserRuleContext {
-		public MetaContext meta() {
-			return getRuleContext(MetaContext.class,0);
+	public static class ValContext extends ParserRuleContext {
+		public SingleValContext singleVal() {
+			return getRuleContext(SingleValContext.class,0);
+		}
+		public TerminalNode LPAREN() { return getToken(NCIntentDslParser.LPAREN, 0); }
+		public List<ValContext> val() {
+			return getRuleContexts(ValContext.class);
 		}
-		public LvalQualContext lvalQual() {
-			return getRuleContext(LvalQualContext.class,0);
+		public ValContext val(int i) {
+			return getRuleContext(ValContext.class,i);
 		}
-		public LvalContext(ParserRuleContext parent, int invokingState) {
+		public TerminalNode RPAREN() { return getToken(NCIntentDslParser.RPAREN, 0); }
+		public TerminalNode COMMA() { return getToken(NCIntentDslParser.COMMA, 0); }
+		public ValContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lval; }
+		@Override public int getRuleIndex() { return RULE_val; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterLval(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterVal(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLval(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitVal(this);
 		}
 	}
 
-	public final LvalContext lval() throws RecognitionException {
-		LvalContext _localctx = new LvalContext(_ctx, getState());
-		enterRule(_localctx, 20, RULE_lval);
-		int _la;
+	public final ValContext val() throws RecognitionException {
+		return val(0);
+	}
+
+	private ValContext val(int _p) throws RecognitionException {
+		ParserRuleContext _parentctx = _ctx;
+		int _parentState = getState();
+		ValContext _localctx = new ValContext(_ctx, _parentState);
+		ValContext _prevctx = _localctx;
+		int _startState = 30;
+		enterRecursionRule(_localctx, 30, RULE_val, _p);
 		try {
+			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(123);
+			setState(168);
 			_errHandler.sync(this);
-			_la = _input.LA(1);
-			if (_la==ID) {
+			switch (_input.LA(1)) {
+			case T__4:
+			case T__6:
+			case T__7:
+			case T__8:
+			case T__9:
+			case T__10:
+			case T__11:
+			case T__12:
+			case T__13:
+			case SQSTRING:
+			case DQSTRING:
+			case TILDA:
+			case POUND:
+			case MINUS:
+			case DOLLAR:
+			case BOOL:
+			case INT:
+			case ID:
 				{
-				setState(122);
-				lvalQual(0);
+				setState(163);
+				singleVal();
+				}
+				break;
+			case LPAREN:
+				{
+				setState(164);
+				match(LPAREN);
+				setState(165);
+				val(0);
+				setState(166);
+				match(RPAREN);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			_ctx.stop = _input.LT(-1);
+			setState(175);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,13,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					if ( _parseListeners!=null ) triggerExitRuleEvent();
+					_prevctx = _localctx;
+					{
+					{
+					_localctx = new ValContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_val);
+					setState(170);
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(171);
+					match(COMMA);
+					setState(172);
+					val(2);
+					}
+					} 
 				}
+				setState(177);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,13,_ctx);
 			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			unrollRecursionContexts(_parentctx);
+		}
+		return _localctx;
+	}
+
+	public static class SingleValContext extends ParserRuleContext {
+		public TerminalNode INT() { return getToken(NCIntentDslParser.INT, 0); }
+		public TerminalNode EXP() { return getToken(NCIntentDslParser.EXP, 0); }
+		public TerminalNode MINUS() { return getToken(NCIntentDslParser.MINUS, 0); }
+		public TerminalNode BOOL() { return getToken(NCIntentDslParser.BOOL, 0); }
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
+		}
+		public TokQualContext tokQual() {
+			return getRuleContext(TokQualContext.class,0);
+		}
+		public TokMetaContext tokMeta() {
+			return getRuleContext(TokMetaContext.class,0);
+		}
+		public ModelMetaContext modelMeta() {
+			return getRuleContext(ModelMetaContext.class,0);
+		}
+		public IntentMetaContext intentMeta() {
+			return getRuleContext(IntentMetaContext.class,0);
+		}
+		public SingleValContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_singleVal; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterSingleVal(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitSingleVal(this);
+		}
+	}
 
-			setState(134);
+	public final SingleValContext singleVal() throws RecognitionException {
+		SingleValContext _localctx = new SingleValContext(_ctx, getState());
+		enterRule(_localctx, 32, RULE_singleVal);
+		int _la;
+		try {
+			setState(199);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__4:
+			switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
 				{
-				setState(125);
+				setState(178);
 				match(T__4);
 				}
 				break;
-			case T__5:
+			case 2:
+				enterOuterAlt(_localctx, 2);
 				{
-				setState(126);
-				match(T__5);
+				setState(180);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==MINUS) {
+					{
+					setState(179);
+					match(MINUS);
+					}
+				}
+
+				setState(185);
+				_errHandler.sync(this);
+				switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) {
+				case 1:
+					{
+					setState(182);
+					match(INT);
+					}
+					break;
+				case 2:
+					{
+					setState(183);
+					match(INT);
+					setState(184);
+					match(EXP);
+					}
+					break;
 				}
-				break;
-			case T__6:
-				{
-				setState(127);
-				match(T__6);
 				}
 				break;
-			case T__7:
+			case 3:
+				enterOuterAlt(_localctx, 3);
 				{
-				setState(128);
-				match(T__7);
+				setState(187);
+				match(BOOL);
 				}
 				break;
-			case T__8:
+			case 4:
+				enterOuterAlt(_localctx, 4);
 				{
-				setState(129);
-				match(T__8);
+				setState(188);
+				qstring();
 				}
 				break;
-			case T__9:
+			case 5:
+				enterOuterAlt(_localctx, 5);
 				{
-				setState(130);
-				match(T__9);
+				setState(190);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==ID) {
+					{
+					setState(189);
+					tokQual(0);
+					}
+				}
+
+				setState(192);
+				_la = _input.LA(1);
+				if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13))) != 0)) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
 				}
 				break;
-			case T__10:
+			case 6:
+				enterOuterAlt(_localctx, 6);
 				{
-				setState(131);
-				match(T__10);
+				setState(194);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==ID) {
+					{
+					setState(193);
+					tokQual(0);
+					}
+				}
+
+				setState(196);
+				tokMeta();
 				}
 				break;
-			case T__11:
+			case 7:
+				enterOuterAlt(_localctx, 7);
 				{
-				setState(132);
-				match(T__11);
+				setState(197);
+				modelMeta();
 				}
 				break;
-			case TILDA:
+			case 8:
+				enterOuterAlt(_localctx, 8);
 				{
-				setState(133);
-				meta();
+				setState(198);
+				intentMeta();
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
-			}
 			}
 		}
 		catch (RecognitionException re) {
@@ -869,68 +1334,68 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalQualContext extends ParserRuleContext {
-		public LvalPartContext lvalPart() {
-			return getRuleContext(LvalPartContext.class,0);
+	public static class TokQualContext extends ParserRuleContext {
+		public TokQualPartContext tokQualPart() {
+			return getRuleContext(TokQualPartContext.class,0);
 		}
-		public LvalQualContext lvalQual() {
-			return getRuleContext(LvalQualContext.class,0);
+		public TokQualContext tokQual() {
+			return getRuleContext(TokQualContext.class,0);
 		}
-		public LvalQualContext(ParserRuleContext parent, int invokingState) {
+		public TokQualContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lvalQual; }
+		@Override public int getRuleIndex() { return RULE_tokQual; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterLvalQual(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterTokQual(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLvalQual(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTokQual(this);
 		}
 	}
 
-	public final LvalQualContext lvalQual() throws RecognitionException {
-		return lvalQual(0);
+	public final TokQualContext tokQual() throws RecognitionException {
+		return tokQual(0);
 	}
 
-	private LvalQualContext lvalQual(int _p) throws RecognitionException {
+	private TokQualContext tokQual(int _p) throws RecognitionException {
 		ParserRuleContext _parentctx = _ctx;
 		int _parentState = getState();
-		LvalQualContext _localctx = new LvalQualContext(_ctx, _parentState);
-		LvalQualContext _prevctx = _localctx;
-		int _startState = 22;
-		enterRecursionRule(_localctx, 22, RULE_lvalQual, _p);
+		TokQualContext _localctx = new TokQualContext(_ctx, _parentState);
+		TokQualContext _prevctx = _localctx;
+		int _startState = 34;
+		enterRecursionRule(_localctx, 34, RULE_tokQual, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(137);
-			lvalPart();
+			setState(202);
+			tokQualPart();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(143);
+			setState(208);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+			_alt = getInterpreter().adaptivePredict(_input,19,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
 				if ( _alt==1 ) {
 					if ( _parseListeners!=null ) triggerExitRuleEvent();
 					_prevctx = _localctx;
 					{
 					{
-					_localctx = new LvalQualContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_lvalQual);
-					setState(139);
+					_localctx = new TokQualContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_tokQual);
+					setState(204);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(140);
-					lvalPart();
+					setState(205);
+					tokQualPart();
 					}
 					} 
 				}
-				setState(145);
+				setState(210);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,10,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,19,_ctx);
 			}
 			}
 		}
@@ -945,32 +1410,32 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalPartContext extends ParserRuleContext {
+	public static class TokQualPartContext extends ParserRuleContext {
 		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
 		public TerminalNode DOT() { return getToken(NCIntentDslParser.DOT, 0); }
-		public LvalPartContext(ParserRuleContext parent, int invokingState) {
+		public TokQualPartContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lvalPart; }
+		@Override public int getRuleIndex() { return RULE_tokQualPart; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterLvalPart(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterTokQualPart(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLvalPart(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTokQualPart(this);
 		}
 	}
 
-	public final LvalPartContext lvalPart() throws RecognitionException {
-		LvalPartContext _localctx = new LvalPartContext(_ctx, getState());
-		enterRule(_localctx, 24, RULE_lvalPart);
+	public final TokQualPartContext tokQualPart() throws RecognitionException {
+		TokQualPartContext _localctx = new TokQualPartContext(_ctx, getState());
+		enterRule(_localctx, 36, RULE_tokQualPart);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(146);
+			setState(211);
 			match(ID);
-			setState(147);
+			setState(212);
 			match(DOT);
 			}
 		}
@@ -985,93 +1450,75 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class RvalSingleContext extends ParserRuleContext {
+	public static class TokMetaContext extends ParserRuleContext {
+		public TerminalNode TILDA() { return getToken(NCIntentDslParser.TILDA, 0); }
+		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
+		public TerminalNode LBR() { return getToken(NCIntentDslParser.LBR, 0); }
 		public TerminalNode INT() { return getToken(NCIntentDslParser.INT, 0); }
-		public TerminalNode EXP() { return getToken(NCIntentDslParser.EXP, 0); }
-		public TerminalNode MINUS() { return getToken(NCIntentDslParser.MINUS, 0); }
-		public TerminalNode BOOL() { return getToken(NCIntentDslParser.BOOL, 0); }
+		public TerminalNode RBR() { return getToken(NCIntentDslParser.RBR, 0); }
 		public QstringContext qstring() {
 			return getRuleContext(QstringContext.class,0);
 		}
-		public RvalSingleContext(ParserRuleContext parent, int invokingState) {
+		public TokMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_rvalSingle; }
+		@Override public int getRuleIndex() { return RULE_tokMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterRvalSingle(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterTokMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRvalSingle(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTokMeta(this);
 		}
 	}
 
-	public final RvalSingleContext rvalSingle() throws RecognitionException {
-		RvalSingleContext _localctx = new RvalSingleContext(_ctx, getState());
-		enterRule(_localctx, 26, RULE_rvalSingle);
-		int _la;
+	public final TokMetaContext tokMeta() throws RecognitionException {
+		TokMetaContext _localctx = new TokMetaContext(_ctx, getState());
+		enterRule(_localctx, 38, RULE_tokMeta);
 		try {
-			setState(160);
+			setState(227);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__12:
+			switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(149);
-				match(T__12);
+				setState(214);
+				match(TILDA);
+				setState(215);
+				match(ID);
 				}
 				break;
-			case MINUS:
-			case INT:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(151);
-				_errHandler.sync(this);
-				_la = _input.LA(1);
-				if (_la==MINUS) {
-					{
-					setState(150);
-					match(MINUS);
-					}
-				}
-
-				setState(156);
-				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
-				case 1:
-					{
-					setState(153);
-					match(INT);
-					}
-					break;
-				case 2:
-					{
-					setState(154);
-					match(INT);
-					setState(155);
-					match(EXP);
-					}
-					break;
-				}
+				setState(216);
+				match(TILDA);
+				setState(217);
+				match(ID);
+				setState(218);
+				match(LBR);
+				setState(219);
+				match(INT);
+				setState(220);
+				match(RBR);
 				}
 				break;
-			case BOOL:
+			case 3:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(158);
-				match(BOOL);
-				}
-				break;
-			case QSTRING:
-				enterOuterAlt(_localctx, 4);
-				{
-				setState(159);
+				setState(221);
+				match(TILDA);
+				setState(222);
+				match(ID);
+				setState(223);
+				match(LBR);
+				setState(224);
 				qstring();
+				setState(225);
+				match(RBR);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 		}
 		catch (RecognitionException re) {
@@ -1085,139 +1532,75 @@ public class NCIntentDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class RvalContext extends ParserRuleContext {
-		public RvalSingleContext rvalSingle() {
-			return getRuleContext(RvalSingleContext.class,0);
-		}
-		public TerminalNode LPAREN() { return getToken(NCIntentDslParser.LPAREN, 0); }
-		public RvalListContext rvalList() {
-			return getRuleContext(RvalListContext.class,0);
+	public static class ModelMetaContext extends ParserRuleContext {
+		public TerminalNode POUND() { return getToken(NCIntentDslParser.POUND, 0); }
+		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
+		public TerminalNode LBR() { return getToken(NCIntentDslParser.LBR, 0); }
+		public TerminalNode INT() { return getToken(NCIntentDslParser.INT, 0); }
+		public TerminalNode RBR() { return getToken(NCIntentDslParser.RBR, 0); }
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
 		}
-		public TerminalNode RPAREN() { return getToken(NCIntentDslParser.RPAREN, 0); }
-		public RvalContext(ParserRuleContext parent, int invokingState) {
+		public ModelMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_rval; }
+		@Override public int getRuleIndex() { return RULE_modelMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterRval(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterModelMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRval(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitModelMeta(this);
 		}
 	}
 
-	public final RvalContext rval() throws RecognitionException {
-		RvalContext _localctx = new RvalContext(_ctx, getState());
-		enterRule(_localctx, 28, RULE_rval);
+	public final ModelMetaContext modelMeta() throws RecognitionException {
+		ModelMetaContext _localctx = new ModelMetaContext(_ctx, getState());
+		enterRule(_localctx, 40, RULE_modelMeta);
 		try {
-			setState(167);
+			setState(242);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__12:
-			case QSTRING:
-			case MINUS:
-			case BOOL:
-			case INT:
+			switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(162);
-				rvalSingle();
+				setState(229);
+				match(POUND);
+				setState(230);
+				match(ID);
 				}
 				break;
-			case LPAREN:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(163);
-				match(LPAREN);
-				setState(164);
-				rvalList(0);
-				setState(165);
-				match(RPAREN);
+				setState(231);
+				match(POUND);
+				setState(232);
+				match(ID);
+				setState(233);
+				match(LBR);
+				setState(234);
+				match(INT);
+				setState(235);
+				match(RBR);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
-			}
-		}
-		catch (RecognitionException re) {
-			_localctx.exception = re;
-			_errHandler.reportError(this, re);
-			_errHandler.recover(this, re);
-		}
-		finally {
-			exitRule();
-		}
-		return _localctx;
-	}
-
-	public static class RvalListContext extends ParserRuleContext {
-		public RvalSingleContext rvalSingle() {
-			return getRuleContext(RvalSingleContext.class,0);
-		}
-		public RvalListContext rvalList() {
-			return getRuleContext(RvalListContext.class,0);
-		}
-		public TerminalNode COMMA() { return getToken(NCIntentDslParser.COMMA, 0); }
-		public RvalListContext(ParserRuleContext parent, int invokingState) {
-			super(parent, invokingState);
-		}
-		@Override public int getRuleIndex() { return RULE_rvalList; }
-		@Override
-		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterRvalList(this);
-		}
-		@Override
-		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitRvalList(this);
-		}
-	}
-
-	public final RvalListContext rvalList() throws RecognitionException {
-		return rvalList(0);
-	}
-
-	private RvalListContext rvalList(int _p) throws RecognitionException {
-		ParserRuleContext _parentctx = _ctx;
-		int _parentState = getState();
-		RvalListContext _localctx = new RvalListContext(_ctx, _parentState);
-		RvalListContext _prevctx = _localctx;
-		int _startState = 30;
-		enterRecursionRule(_localctx, 30, RULE_rvalList, _p);
-		try {
-			int _alt;
-			enterOuterAlt(_localctx, 1);
-			{
-			{
-			setState(170);
-			rvalSingle();
-			}
-			_ctx.stop = _input.LT(-1);
-			setState(177);
-			_errHandler.sync(this);
-			_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();
-					_prevctx = _localctx;
-					{
-					{
-					_localctx = new RvalListContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_rvalList);
-					setState(172);
-					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(173);
-					match(COMMA);
-					setState(174);
-					rvalSingle();
-					}
-					} 
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(236);
+				match(POUND);
+				setState(237);
+				match(ID);
+				setState(238);
+				match(LBR);
+				setState(239);
+				qstring();
+				setState(240);
+				match(RBR);
 				}
-				setState(179);
-				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,15,_ctx);
-			}
+				break;
 			}
 		}
 		catch (RecognitionException re) {
@@ -1226,13 +1609,13 @@ public class NCIntentDslParser extends Parser {
 			_errHandler.recover(this, re);
 		}
 		finally {
-			unrollRecursionContexts(_parentctx);
+			exitRule();
 		}
 		return _localctx;
 	}
 
-	public static class MetaContext extends ParserRuleContext {
-		public TerminalNode TILDA() { return getToken(NCIntentDslParser.TILDA, 0); }
+	public static class IntentMetaContext extends ParserRuleContext {
+		public TerminalNode DOLLAR() { return getToken(NCIntentDslParser.DOLLAR, 0); }
 		public TerminalNode ID() { return getToken(NCIntentDslParser.ID, 0); }
 		public TerminalNode LBR() { return getToken(NCIntentDslParser.LBR, 0); }
 		public TerminalNode INT() { return getToken(NCIntentDslParser.INT, 0); }
@@ -1240,63 +1623,63 @@ public class NCIntentDslParser extends Parser {
 		public QstringContext qstring() {
 			return getRuleContext(QstringContext.class,0);
 		}
-		public MetaContext(ParserRuleContext parent, int invokingState) {
+		public IntentMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_meta; }
+		@Override public int getRuleIndex() { return RULE_intentMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterMeta(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).enterIntentMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMeta(this);
+			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIntentMeta(this);
 		}
 	}
 
-	public final MetaContext meta() throws RecognitionException {
-		MetaContext _localctx = new MetaContext(_ctx, getState());
-		enterRule(_localctx, 32, RULE_meta);
+	public final IntentMetaContext intentMeta() throws RecognitionException {
+		IntentMetaContext _localctx = new IntentMetaContext(_ctx, getState());
+		enterRule(_localctx, 42, RULE_intentMeta);
 		try {
-			setState(193);
+			setState(257);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(180);
-				match(TILDA);
-				setState(181);
+				setState(244);
+				match(DOLLAR);
+				setState(245);
 				match(ID);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(182);
-				match(TILDA);
-				setState(183);
+				setState(246);
+				match(DOLLAR);
+				setState(247);
 				match(ID);
-				setState(184);
+				setState(248);
 				match(LBR);
-				setState(185);
+				setState(249);
 				match(INT);
-				setState(186);
+				setState(250);
 				match(RBR);
 				}
 				break;
 			case 3:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(187);
-				match(TILDA);
-				setState(188);
+				setState(251);
+				match(DOLLAR);
+				setState(252);
 				match(ID);
-				setState(189);
+				setState(253);
 				match(LBR);
-				setState(190);
+				setState(254);
 				qstring();
-				setState(191);
+				setState(255);
 				match(RBR);
 				}
 				break;
@@ -1314,7 +1697,8 @@ public class NCIntentDslParser extends Parser {
 	}
 
 	public static class QstringContext extends ParserRuleContext {
-		public TerminalNode QSTRING() { return getToken(NCIntentDslParser.QSTRING, 0); }
+		public TerminalNode SQSTRING() { return getToken(NCIntentDslParser.SQSTRING, 0); }
+		public TerminalNode DQSTRING() { return getToken(NCIntentDslParser.DQSTRING, 0); }
 		public QstringContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1331,12 +1715,21 @@ public class NCIntentDslParser extends Parser {
 
 	public final QstringContext qstring() throws RecognitionException {
 		QstringContext _localctx = new QstringContext(_ctx, getState());
-		enterRule(_localctx, 34, RULE_qstring);
+		enterRule(_localctx, 44, RULE_qstring);
+		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(195);
-			match(QSTRING);
+			setState(259);
+			_la = _input.LA(1);
+			if ( !(_la==SQSTRING || _la==DQSTRING) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
 			}
 		}
 		catch (RecognitionException re) {
@@ -1373,9 +1766,9 @@ public class NCIntentDslParser extends Parser {
 
 	public final MinMaxContext minMax() throws RecognitionException {
 		MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
-		enterRule(_localctx, 36, RULE_minMax);
+		enterRule(_localctx, 46, RULE_minMax);
 		try {
-			setState(199);
+			setState(263);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case PLUS:
@@ -1383,14 +1776,14 @@ public class NCIntentDslParser extends Parser {
 			case STAR:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(197);
+				setState(261);
 				minMaxShortcut();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(198);
+				setState(262);
 				minMaxRange();
 				}
 				break;
@@ -1429,12 +1822,12 @@ public class NCIntentDslParser extends Parser {
 
 	public final MinMaxShortcutContext minMaxShortcut() throws RecognitionException {
 		MinMaxShortcutContext _localctx = new MinMaxShortcutContext(_ctx, getState());
-		enterRule(_localctx, 38, RULE_minMaxShortcut);
+		enterRule(_localctx, 48, RULE_minMaxShortcut);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(201);
+			setState(265);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << QUESTION) | (1L << STAR))) != 0)) ) {
 			_errHandler.recoverInline(this);
@@ -1481,19 +1874,19 @@ public class NCIntentDslParser extends Parser {
 
 	public final MinMaxRangeContext minMaxRange() throws RecognitionException {
 		MinMaxRangeContext _localctx = new MinMaxRangeContext(_ctx, getState());
-		enterRule(_localctx, 40, RULE_minMaxRange);
+		enterRule(_localctx, 50, RULE_minMaxRange);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(203);
+			setState(267);
 			match(LBR);
-			setState(204);
+			setState(268);
 			match(INT);
-			setState(205);
+			setState(269);
 			match(COMMA);
-			setState(206);
+			setState(270);
 			match(INT);
-			setState(207);
+			setState(271);
 			match(RBR);
 			}
 		}
@@ -1510,113 +1903,147 @@ public class NCIntentDslParser extends Parser {
 
 	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
 		switch (ruleIndex) {
-		case 4:
-			return terms_sempred((TermsContext)_localctx, predIndex);
+		case 5:
+			return metaList_sempred((MetaListContext)_localctx, predIndex);
 		case 8:
+			return terms_sempred((TermsContext)_localctx, predIndex);
+		case 12:
 			return item_sempred((ItemContext)_localctx, predIndex);
-		case 11:
-			return lvalQual_sempred((LvalQualContext)_localctx, predIndex);
 		case 15:
-			return rvalList_sempred((RvalListContext)_localctx, predIndex);
+			return val_sempred((ValContext)_localctx, predIndex);
+		case 17:
+			return tokQual_sempred((TokQualContext)_localctx, predIndex);
 		}
 		return true;
 	}
-	private boolean terms_sempred(TermsContext _localctx, int predIndex) {
+	private boolean metaList_sempred(MetaListContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 0:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
-	private boolean item_sempred(ItemContext _localctx, int predIndex) {
+	private boolean terms_sempred(TermsContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 1:
-			return precpred(_ctx, 2);
+			return precpred(_ctx, 1);
 		}
 		return true;
 	}
-	private boolean lvalQual_sempred(LvalQualContext _localctx, int predIndex) {
+	private boolean item_sempred(ItemContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 2:
-			return precpred(_ctx, 1);
+			return precpred(_ctx, 2);
 		}
 		return true;
 	}
-	private boolean rvalList_sempred(RvalListContext _localctx, int predIndex) {
+	private boolean val_sempred(ValContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 3:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
+	private boolean tokQual_sempred(TokQualContext _localctx, int predIndex) {
+		switch (predIndex) {
+		case 4:
+			return precpred(_ctx, 1);
+		}
+		return true;
+	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3/\u00d4\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\3\2\3\2\5\2/\n\2\3\2\5\2\62\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\7\6H\n\6\f\6\16\6K\13\6\3\7\3\7\3\b\3\b\5\bQ\n\b\3\b\3\b"+
-		"\3\b\3\b\3\b\5\bX\n\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+
-		"\5\nf\n\n\3\n\3\n\3\n\7\nk\n\n\f\n\16\nn\13\n\3\13\3\13\3\13\3\13\3\13"+
-		"\3\13\3\13\3\13\3\13\3\13\3\13\5\13{\n\13\3\f\5\f~\n\f\3\f\3\f\3\f\3\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\r\7\r\u0090\n\r\f"+
-		"\r\16\r\u0093\13\r\3\16\3\16\3\16\3\17\3\17\5\17\u009a\n\17\3\17\3\17"+
-		"\3\17\5\17\u009f\n\17\3\17\3\17\5\17\u00a3\n\17\3\20\3\20\3\20\3\20\3"+
-		"\20\5\20\u00aa\n\20\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u00b2\n\21\f\21"+
-		"\16\21\u00b5\13\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3"+
-		"\22\3\22\3\22\5\22\u00c4\n\22\3\23\3\23\3\24\3\24\5\24\u00ca\n\24\3\25"+
-		"\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\2\6\n\22\30 \27\2\4\6\b\n\f\16"+
-		"\20\22\24\26\30\32\34\36 \"$&(*\2\5\4\2\33\33$$\3\2\22\23\3\2%\'\2\u00db"+
-		"\2,\3\2\2\2\4\66\3\2\2\2\6:\3\2\2\2\b>\3\2\2\2\nB\3\2\2\2\fL\3\2\2\2\16"+
-		"N\3\2\2\2\20Y\3\2\2\2\22e\3\2\2\2\24z\3\2\2\2\26}\3\2\2\2\30\u008a\3\2"+
-		"\2\2\32\u0094\3\2\2\2\34\u00a2\3\2\2\2\36\u00a9\3\2\2\2 \u00ab\3\2\2\2"+
-		"\"\u00c3\3\2\2\2$\u00c5\3\2\2\2&\u00c9\3\2\2\2(\u00cb\3\2\2\2*\u00cd\3"+
-		"\2\2\2,.\5\4\3\2-/\5\6\4\2.-\3\2\2\2./\3\2\2\2/\61\3\2\2\2\60\62\5\b\5"+
-		"\2\61\60\3\2\2\2\61\62\3\2\2\2\62\63\3\2\2\2\63\64\5\n\6\2\64\65\7\2\2"+
-		"\3\65\3\3\2\2\2\66\67\7\3\2\2\678\7$\2\289\7-\2\29\5\3\2\2\2:;\7\4\2\2"+
-		";<\7$\2\2<=\7*\2\2=\7\3\2\2\2>?\7\5\2\2?@\7$\2\2@A\5$\23\2A\t\3\2\2\2"+
-		"BC\b\6\1\2CD\5\16\b\2DI\3\2\2\2EF\f\3\2\2FH\5\16\b\2GE\3\2\2\2HK\3\2\2"+
-		"\2IG\3\2\2\2IJ\3\2\2\2J\13\3\2\2\2KI\3\2\2\2LM\t\2\2\2M\r\3\2\2\2NP\7"+
-		"\6\2\2OQ\5\20\t\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2RS\5\f\7\2ST\7\30\2\2T"+
-		"U\5\22\n\2UW\7\31\2\2VX\5&\24\2WV\3\2\2\2WX\3\2\2\2X\17\3\2\2\2YZ\7\26"+
-		"\2\2Z[\7-\2\2[\\\7\27\2\2\\\21\3\2\2\2]^\b\n\1\2^f\5\24\13\2_`\7\26\2"+
-		"\2`a\5\22\n\2ab\7\27\2\2bf\3\2\2\2cd\7\25\2\2df\5\22\n\3e]\3\2\2\2e_\3"+
-		"\2\2\2ec\3\2\2\2fl\3\2\2\2gh\f\4\2\2hi\t\3\2\2ik\5\22\n\5jg\3\2\2\2kn"+
-		"\3\2\2\2lj\3\2\2\2lm\3\2\2\2m\23\3\2\2\2nl\3\2\2\2op\5\26\f\2pq\7\21\2"+
-		"\2qr\5\36\20\2r{\3\2\2\2st\7-\2\2tu\7\26\2\2uv\5\26\f\2vw\7\27\2\2wx\7"+
-		"\21\2\2xy\5\36\20\2y{\3\2\2\2zo\3\2\2\2zs\3\2\2\2{\25\3\2\2\2|~\5\30\r"+
-		"\2}|\3\2\2\2}~\3\2\2\2~\u0088\3\2\2\2\177\u0089\7\7\2\2\u0080\u0089\7"+
-		"\b\2\2\u0081\u0089\7\t\2\2\u0082\u0089\7\n\2\2\u0083\u0089\7\13\2\2\u0084"+
-		"\u0089\7\f\2\2\u0085\u0089\7\r\2\2\u0086\u0089\7\16\2\2\u0087\u0089\5"+
-		"\"\22\2\u0088\177\3\2\2\2\u0088\u0080\3\2\2\2\u0088\u0081\3\2\2\2\u0088"+
-		"\u0082\3\2\2\2\u0088\u0083\3\2\2\2\u0088\u0084\3\2\2\2\u0088\u0085\3\2"+
-		"\2\2\u0088\u0086\3\2\2\2\u0088\u0087\3\2\2\2\u0089\27\3\2\2\2\u008a\u008b"+
-		"\b\r\1\2\u008b\u008c\5\32\16\2\u008c\u0091\3\2\2\2\u008d\u008e\f\3\2\2"+
-		"\u008e\u0090\5\32\16\2\u008f\u008d\3\2\2\2\u0090\u0093\3\2\2\2\u0091\u008f"+
-		"\3\2\2\2\u0091\u0092\3\2\2\2\u0092\31\3\2\2\2\u0093\u0091\3\2\2\2\u0094"+
-		"\u0095\7-\2\2\u0095\u0096\7\"\2\2\u0096\33\3\2\2\2\u0097\u00a3\7\17\2"+
-		"\2\u0098\u009a\7!\2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009e"+
-		"\3\2\2\2\u009b\u009f\7+\2\2\u009c\u009d\7+\2\2\u009d\u009f\7,\2\2\u009e"+
-		"\u009b\3\2\2\2\u009e\u009c\3\2\2\2\u009f\u00a3\3\2\2\2\u00a0\u00a3\7*"+
-		"\2\2\u00a1\u00a3\5$\23\2\u00a2\u0097\3\2\2\2\u00a2\u0099\3\2\2\2\u00a2"+
-		"\u00a0\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3\35\3\2\2\2\u00a4\u00aa\5\34\17"+
-		"\2\u00a5\u00a6\7\26\2\2\u00a6\u00a7\5 \21\2\u00a7\u00a8\7\27\2\2\u00a8"+
-		"\u00aa\3\2\2\2\u00a9\u00a4\3\2\2\2\u00a9\u00a5\3\2\2\2\u00aa\37\3\2\2"+
-		"\2\u00ab\u00ac\b\21\1\2\u00ac\u00ad\5\34\17\2\u00ad\u00b3\3\2\2\2\u00ae"+
-		"\u00af\f\3\2\2\u00af\u00b0\7\37\2\2\u00b0\u00b2\5\34\17\2\u00b1\u00ae"+
-		"\3\2\2\2\u00b2\u00b5\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4"+
-		"!\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b6\u00b7\7\33\2\2\u00b7\u00c4\7-\2\2"+
-		"\u00b8\u00b9\7\33\2\2\u00b9\u00ba\7-\2\2\u00ba\u00bb\7\35\2\2\u00bb\u00bc"+
-		"\7+\2\2\u00bc\u00c4\7\36\2\2\u00bd\u00be\7\33\2\2\u00be\u00bf\7-\2\2\u00bf"+
-		"\u00c0\7\35\2\2\u00c0\u00c1\5$\23\2\u00c1\u00c2\7\36\2\2\u00c2\u00c4\3"+
-		"\2\2\2\u00c3\u00b6\3\2\2\2\u00c3\u00b8\3\2\2\2\u00c3\u00bd\3\2\2\2\u00c4"+
-		"#\3\2\2\2\u00c5\u00c6\7\20\2\2\u00c6%\3\2\2\2\u00c7\u00ca\5(\25\2\u00c8"+
-		"\u00ca\5*\26\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2\2\2\u00ca\'\3\2\2\2"+
-		"\u00cb\u00cc\t\4\2\2\u00cc)\3\2\2\2\u00cd\u00ce\7\35\2\2\u00ce\u00cf\7"+
-		"+\2\2\u00cf\u00d0\7\37\2\2\u00d0\u00d1\7+\2\2\u00d1\u00d2\7\36\2\2\u00d2"+
-		"+\3\2\2\2\24.\61IPWelz}\u0088\u0091\u0099\u009e\u00a2\u00a9\u00b3\u00c3"+
-		"\u00c9";
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\63\u0114\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\3\2\3\2\5\29\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"+
+		"\5\6T\n\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\7\7^\n\7\f\7\16\7a\13\7\3\b"+
+		"\3\b\3\b\3\b\3\t\3\t\3\t\5\tj\n\t\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\f\3\f\5\fz\n\f\3\f\3\f\3\f\3\f\3\f\5\f\u0081\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\u008f\n"+
+		"\16\3\16\3\16\3\16\7\16\u0094\n\16\f\16\16\16\u0097\13\16\3\17\3\17\3"+
+		"\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00a3\n\20\3\21\3\21\3\21"+
+		"\3\21\3\21\3\21\5\21\u00ab\n\21\3\21\3\21\3\21\7\21\u00b0\n\21\f\21\16"+
+		"\21\u00b3\13\21\3\22\3\22\5\22\u00b7\n\22\3\22\3\22\3\22\5\22\u00bc\n"+
+		"\22\3\22\3\22\3\22\5\22\u00c1\n\22\3\22\3\22\5\22\u00c5\n\22\3\22\3\22"+
+		"\3\22\5\22\u00ca\n\22\3\23\3\23\3\23\3\23\3\23\7\23\u00d1\n\23\f\23\16"+
+		"\23\u00d4\13\23\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+
+		"\3\25\3\25\3\25\3\25\3\25\5\25\u00e6\n\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\3\27\3\27"+
+		"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u0104\n\27\3\30\3\30"+
+		"\3\31\3\31\5\31\u010a\n\31\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+
+		"\2\7\f\22\32 $\34\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62"+
+		"\64\2\7\4\2\36\36((\3\2\24\25\3\2\t\20\3\2\21\22\3\2)+\2\u011c\2\66\3"+
+		"\2\2\2\4C\3\2\2\2\6G\3\2\2\2\bK\3\2\2\2\nO\3\2\2\2\fW\3\2\2\2\16b\3\2"+
+		"\2\2\20i\3\2\2\2\22k\3\2\2\2\24u\3\2\2\2\26w\3\2\2\2\30\u0082\3\2\2\2"+
+		"\32\u008e\3\2\2\2\34\u0098\3\2\2\2\36\u00a2\3\2\2\2 \u00aa\3\2\2\2\"\u00c9"+
+		"\3\2\2\2$\u00cb\3\2\2\2&\u00d5\3\2\2\2(\u00e5\3\2\2\2*\u00f4\3\2\2\2,"+
+		"\u0103\3\2\2\2.\u0105\3\2\2\2\60\u0109\3\2\2\2\62\u010b\3\2\2\2\64\u010d"+
+		"\3\2\2\2\668\5\4\3\2\679\5\6\4\28\67\3\2\2\289\3\2\2\29;\3\2\2\2:<\5\b"+
+		"\5\2;:\3\2\2\2;<\3\2\2\2<>\3\2\2\2=?\5\n\6\2>=\3\2\2\2>?\3\2\2\2?@\3\2"+
+		"\2\2@A\5\22\n\2AB\7\2\2\3B\3\3\2\2\2CD\7\3\2\2DE\7(\2\2EF\7\61\2\2F\5"+
+		"\3\2\2\2GH\7\4\2\2HI\7(\2\2IJ\7.\2\2J\7\3\2\2\2KL\7\5\2\2LM\7(\2\2MN\5"+
+		".\30\2N\t\3\2\2\2OP\7\6\2\2PQ\7(\2\2QS\7\32\2\2RT\5\f\7\2SR\3\2\2\2ST"+
+		"\3\2\2\2TU\3\2\2\2UV\7\33\2\2V\13\3\2\2\2WX\b\7\1\2XY\5\16\b\2Y_\3\2\2"+
+		"\2Z[\f\3\2\2[\\\7#\2\2\\^\5\16\b\2]Z\3\2\2\2^a\3\2\2\2_]\3\2\2\2_`\3\2"+
+		"\2\2`\r\3\2\2\2a_\3\2\2\2bc\5.\30\2cd\7$\2\2de\5\20\t\2e\17\3\2\2\2fj"+
+		"\7\7\2\2gj\7.\2\2hj\5.\30\2if\3\2\2\2ig\3\2\2\2ih\3\2\2\2j\21\3\2\2\2"+
+		"kl\b\n\1\2lm\5\26\f\2mr\3\2\2\2no\f\3\2\2oq\5\26\f\2pn\3\2\2\2qt\3\2\2"+
+		"\2rp\3\2\2\2rs\3\2\2\2s\23\3\2\2\2tr\3\2\2\2uv\t\2\2\2v\25\3\2\2\2wy\7"+
+		"\b\2\2xz\5\30\r\2yx\3\2\2\2yz\3\2\2\2z{\3\2\2\2{|\5\24\13\2|}\7\32\2\2"+
+		"}~\5\32\16\2~\u0080\7\33\2\2\177\u0081\5\60\31\2\u0080\177\3\2\2\2\u0080"+
+		"\u0081\3\2\2\2\u0081\27\3\2\2\2\u0082\u0083\7\30\2\2\u0083\u0084\7\61"+
+		"\2\2\u0084\u0085\7\31\2\2\u0085\31\3\2\2\2\u0086\u0087\b\16\1\2\u0087"+
+		"\u008f\5\34\17\2\u0088\u0089\7\30\2\2\u0089\u008a\5\32\16\2\u008a\u008b"+
+		"\7\31\2\2\u008b\u008f\3\2\2\2\u008c\u008d\7\27\2\2\u008d\u008f\5\32\16"+
+		"\3\u008e\u0086\3\2\2\2\u008e\u0088\3\2\2\2\u008e\u008c\3\2\2\2\u008f\u0095"+
+		"\3\2\2\2\u0090\u0091\f\4\2\2\u0091\u0092\t\3\2\2\u0092\u0094\5\32\16\5"+
+		"\u0093\u0090\3\2\2\2\u0094\u0097\3\2\2\2\u0095\u0093\3\2\2\2\u0095\u0096"+
+		"\3\2\2\2\u0096\33\3\2\2\2\u0097\u0095\3\2\2\2\u0098\u0099\5\36\20\2\u0099"+
+		"\u009a\7\23\2\2\u009a\u009b\5\36\20\2\u009b\35\3\2\2\2\u009c\u00a3\5 "+
+		"\21\2\u009d\u009e\7\61\2\2\u009e\u009f\7\30\2\2\u009f\u00a0\5\36\20\2"+
+		"\u00a0\u00a1\7\31\2\2\u00a1\u00a3\3\2\2\2\u00a2\u009c\3\2\2\2\u00a2\u009d"+
+		"\3\2\2\2\u00a3\37\3\2\2\2\u00a4\u00a5\b\21\1\2\u00a5\u00ab\5\"\22\2\u00a6"+
+		"\u00a7\7\30\2\2\u00a7\u00a8\5 \21\2\u00a8\u00a9\7\31\2\2\u00a9\u00ab\3"+
+		"\2\2\2\u00aa\u00a4\3\2\2\2\u00aa\u00a6\3\2\2\2\u00ab\u00b1\3\2\2\2\u00ac"+
+		"\u00ad\f\3\2\2\u00ad\u00ae\7#\2\2\u00ae\u00b0\5 \21\4\u00af\u00ac\3\2"+
+		"\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2"+
+		"!\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00ca\7\7\2\2\u00b5\u00b7\7%\2\2\u00b6"+
+		"\u00b5\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00bb\3\2\2\2\u00b8\u00bc\7/"+
+		"\2\2\u00b9\u00ba\7/\2\2\u00ba\u00bc\7\60\2\2\u00bb\u00b8\3\2\2\2\u00bb"+
+		"\u00b9\3\2\2\2\u00bc\u00ca\3\2\2\2\u00bd\u00ca\7.\2\2\u00be\u00ca\5.\30"+
+		"\2\u00bf\u00c1\5$\23\2\u00c0\u00bf\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c2"+
+		"\3\2\2\2\u00c2\u00ca\t\4\2\2\u00c3\u00c5\5$\23\2\u00c4\u00c3\3\2\2\2\u00c4"+
+		"\u00c5\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6\u00ca\5(\25\2\u00c7\u00ca\5*"+
+		"\26\2\u00c8\u00ca\5,\27\2\u00c9\u00b4\3\2\2\2\u00c9\u00b6\3\2\2\2\u00c9"+
+		"\u00bd\3\2\2\2\u00c9\u00be\3\2\2\2\u00c9\u00c0\3\2\2\2\u00c9\u00c4\3\2"+
+		"\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2\2\2\u00ca#\3\2\2\2\u00cb\u00cc"+
+		"\b\23\1\2\u00cc\u00cd\5&\24\2\u00cd\u00d2\3\2\2\2\u00ce\u00cf\f\3\2\2"+
+		"\u00cf\u00d1\5&\24\2\u00d0\u00ce\3\2\2\2\u00d1\u00d4\3\2\2\2\u00d2\u00d0"+
+		"\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3%\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d5"+
+		"\u00d6\7\61\2\2\u00d6\u00d7\7&\2\2\u00d7\'\3\2\2\2\u00d8\u00d9\7\36\2"+
+		"\2\u00d9\u00e6\7\61\2\2\u00da\u00db\7\36\2\2\u00db\u00dc\7\61\2\2\u00dc"+
+		"\u00dd\7 \2\2\u00dd\u00de\7/\2\2\u00de\u00e6\7!\2\2\u00df\u00e0\7\36\2"+
+		"\2\u00e0\u00e1\7\61\2\2\u00e1\u00e2\7 \2\2\u00e2\u00e3\5.\30\2\u00e3\u00e4"+
+		"\7!\2\2\u00e4\u00e6\3\2\2\2\u00e5\u00d8\3\2\2\2\u00e5\u00da\3\2\2\2\u00e5"+
+		"\u00df\3\2\2\2\u00e6)\3\2\2\2\u00e7\u00e8\7\"\2\2\u00e8\u00f5\7\61\2\2"+
+		"\u00e9\u00ea\7\"\2\2\u00ea\u00eb\7\61\2\2\u00eb\u00ec\7 \2\2\u00ec\u00ed"+
+		"\7/\2\2\u00ed\u00f5\7!\2\2\u00ee\u00ef\7\"\2\2\u00ef\u00f0\7\61\2\2\u00f0"+
+		"\u00f1\7 \2\2\u00f1\u00f2\5.\30\2\u00f2\u00f3\7!\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\u00f7\7,\2\2\u00f7\u0104\7\61\2\2\u00f8\u00f9\7,\2\2\u00f9"+
+		"\u00fa\7\61\2\2\u00fa\u00fb\7 \2\2\u00fb\u00fc\7/\2\2\u00fc\u0104\7!\2"+
+		"\2\u00fd\u00fe\7,\2\2\u00fe\u00ff\7\61\2\2\u00ff\u0100\7 \2\2\u0100\u0101"+
+		"\5.\30\2\u0101\u0102\7!\2\2\u0102\u0104\3\2\2\2\u0103\u00f6\3\2\2\2\u0103"+
+		"\u00f8\3\2\2\2\u0103\u00fd\3\2\2\2\u0104-\3\2\2\2\u0105\u0106\t\5\2\2"+
+		"\u0106/\3\2\2\2\u0107\u010a\5\62\32\2\u0108\u010a\5\64\33\2\u0109\u0107"+
+		"\3\2\2\2\u0109\u0108\3\2\2\2\u010a\61\3\2\2\2\u010b\u010c\t\6\2\2\u010c"+
+		"\63\3\2\2\2\u010d\u010e\7 \2\2\u010e\u010f\7/\2\2\u010f\u0110\7#\2\2\u0110"+
+		"\u0111\7/\2\2\u0111\u0112\7!\2\2\u0112\65\3\2\2\2\328;>S_iry\u0080\u008e"+
+		"\u0095\u00a2\u00aa\u00b1\u00b6\u00bb\u00c0\u00c4\u00c9\u00d2\u00e5\u00f4"+
+		"\u0103\u0109";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
index 99270a1..6e8dee8 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
@@ -206,7 +206,7 @@ public class NCDslTokenPredicate implements Function<NCToken, Boolean> {
         else if (lv instanceof Collection) // Two collections.
             return ((Collection)lv).containsAll((Collection)rv);
         else if (lv instanceof String && rv instanceof String) // Substring containment.
-            return ((String) lv).contains((String) rv);
+            return ((String)lv).contains((String)rv);
         else
             throw operatorError(lv, rv);
     }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
index 5592ebb..f2cb1c1 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelSynonymDslCompiler.scala
@@ -24,7 +24,6 @@ import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.model.NCToken
 import org.apache.nlpcraft.model.intent.utils.NCDslTokenPredicate
 import org.apache.nlpcraft.probe.mgrs.model.antlr4.{NCSynonymDslBaseListener, NCSynonymDslLexer, NCSynonymDslParser}
-//import org.apache.nlpcraft.probe.mgrs.model.antlr4._
 
 import scala.collection.JavaConverters._
 import scala.collection.mutable
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4
index 21f2e39..bb7ee64 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.g4
@@ -23,50 +23,81 @@ synonym
     ;
 alias: LBR ID RBR;
 item
-    : predicate
+    : pred
     | LPAREN item RPAREN
-    | item (AND|OR) item
+    | item (AND | OR) item
     | EXCL item
     ;
-predicate
-    : lval PRED_OP rval
-    | ID LPAREN lval RPAREN PRED_OP rval  // Function call.
+pred: expr PRED_OP expr;
+expr
+    : val
+    | ID LPAREN expr RPAREN // Buit-in function call.
     ;
-lval: lvalQual? ('id' | 'aliases' | 'startidx' | 'endidx' | 'parent' | 'groups' | 'ancestors' | 'value' | meta);
-lvalQual: lvalPart | lvalQual lvalPart;
-lvalPart: ID DOT;
-rvalSingle
+val
+    : singleVal
+    | LPAREN val RPAREN
+    | val COMMA val
+    ;
+singleVal
     : 'null'
     | MINUS? (INT | INT EXP)
     | BOOL
     | qstring
+    | tokQual? ('id' | 'aliases' | 'startidx' | 'endidx' | 'parent' | 'groups' | 'ancestors' | 'value')
+    | tokQual? tokMeta
+    | modelMeta
+    | intentMeta
     ;
-rval
-    : rvalSingle
-    | LPAREN rvalList RPAREN
-    ;
-rvalList
-    : rvalSingle
-    | rvalList COMMA rvalSingle
+tokQual
+    : tokQualPart
+    | tokQual tokQualPart
     ;
-meta
+tokQualPart: ID DOT;
+tokMeta // Token metadata: ~prop
     : TILDA ID
     | TILDA ID LBR INT RBR
     | TILDA ID LBR qstring RBR
     ;
-qstring: SQUOTE ~'\''* SQUOTE;
-PRED_OP: '==' | '!=' | '>=' | '<=' | '>' | '<' | '@@' | '!@';
+modelMeta // Model metadata: #prop
+    : POUND ID
+    | POUND ID LBR INT RBR
+    | POUND ID LBR qstring RBR
+    ;
+intentMeta // Intent metadata: $prop
+    : DOLLAR ID
+    | DOLLAR ID LBR INT RBR
+    | DOLLAR ID LBR qstring RBR
+    ;
+qstring
+    : SQSTRING
+    | DQSTRING
+    ;
+SQSTRING: SQUOTE (~'\'')* SQUOTE;
+DQSTRING: DQUOTE (~'"')* DQUOTE;
+PRED_OP
+    : '==' // Includes regex for strings.
+    | '!=' // Includes regex for strings.
+    | '>='
+    | '<='
+    | '>'
+    | '<'
+    | '@@' // Set or string containment.
+    | '!@' // Set or string not containment.
+    ;
 AND: '&&';
 OR: '||';
 EXCL: '!';
 LPAREN: '(';
 RPAREN: ')';
 SQUOTE: '\'';
+DQUOTE: '"';
+DOLLAR: '$';
 TILDA: '~';
 LBR: '[';
 RBR: ']';
 COMMA: ',';
 COLON: ':';
+POUND: '#';
 MINUS: '-';
 DOT: '.';
 UNDERSCORE: '_';
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.interp
index 28e0d34..0aa2601 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.interp
@@ -1,5 +1,6 @@
 token literal names:
 null
+'null'
 'id'
 'aliases'
 'startidx'
@@ -8,7 +9,8 @@ null
 'groups'
 'ancestors'
 'value'
-'null'
+null
+null
 null
 '&&'
 '||'
@@ -16,11 +18,14 @@ null
 '('
 ')'
 '\''
+'"'
+'$'
 '~'
 '['
 ']'
 ','
 ':'
+'#'
 '-'
 '.'
 '_'
@@ -42,6 +47,8 @@ null
 null
 null
 null
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -49,11 +56,14 @@ EXCL
 LPAREN
 RPAREN
 SQUOTE
+DQUOTE
+DOLLAR
 TILDA
 LBR
 RBR
 COMMA
 COLON
+POUND
 MINUS
 DOT
 UNDERSCORE
@@ -68,16 +78,17 @@ rule names:
 synonym
 alias
 item
-predicate
-lval
-lvalQual
-lvalPart
-rvalSingle
-rval
-rvalList
-meta
+pred
+expr
+val
+singleVal
+tokQual
+tokQualPart
+tokMeta
+modelMeta
+intentMeta
 qstring
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 32, 155, 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, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 36, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 50, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 55, 10, 4, 12, 4, 14, 4, 58, 11, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 37, 173, 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, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 38, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 52, 10, 4, 3, 4, 3, 4, 3, 4, 7, 4, 57, 10, 4, 12, 4, 14, 4, 60, 11, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6 [...]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.tokens
index 06f8bf7..7d51b56 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDsl.tokens
@@ -7,47 +7,55 @@ T__5=6
 T__6=7
 T__7=8
 T__8=9
-PRED_OP=10
-AND=11
-OR=12
-EXCL=13
-LPAREN=14
-RPAREN=15
-SQUOTE=16
-TILDA=17
-LBR=18
-RBR=19
-COMMA=20
-COLON=21
-MINUS=22
-DOT=23
-UNDERSCORE=24
-BOOL=25
-INT=26
-EXP=27
-ID=28
-WS=29
-ErrorCharacter=30
-'id'=1
-'aliases'=2
-'startidx'=3
-'endidx'=4
-'parent'=5
-'groups'=6
-'ancestors'=7
-'value'=8
-'null'=9
-'&&'=11
-'||'=12
-'!'=13
-'('=14
-')'=15
-'\''=16
-'~'=17
-'['=18
-']'=19
-','=20
-':'=21
-'-'=22
-'.'=23
-'_'=24
+SQSTRING=10
+DQSTRING=11
+PRED_OP=12
+AND=13
+OR=14
+EXCL=15
+LPAREN=16
+RPAREN=17
+SQUOTE=18
+DQUOTE=19
+DOLLAR=20
+TILDA=21
+LBR=22
+RBR=23
+COMMA=24
+COLON=25
+POUND=26
+MINUS=27
+DOT=28
+UNDERSCORE=29
+BOOL=30
+INT=31
+EXP=32
+ID=33
+WS=34
+ErrorCharacter=35
+'null'=1
+'id'=2
+'aliases'=3
+'startidx'=4
+'endidx'=5
+'parent'=6
+'groups'=7
+'ancestors'=8
+'value'=9
+'&&'=13
+'||'=14
+'!'=15
+'('=16
+')'=17
+'\''=18
+'"'=19
+'$'=20
+'~'=21
+'['=22
+']'=23
+','=24
+':'=25
+'#'=26
+'-'=27
+'.'=28
+'_'=29
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
index 10dccdd..6258388 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslBaseListener.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
@@ -52,97 +52,109 @@ public class NCSynonymDslBaseListener implements NCSynonymDslListener {
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterPredicate(NCSynonymDslParser.PredicateContext ctx) { }
+	@Override public void enterPred(NCSynonymDslParser.PredContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitPredicate(NCSynonymDslParser.PredicateContext ctx) { }
+	@Override public void exitPred(NCSynonymDslParser.PredContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLval(NCSynonymDslParser.LvalContext ctx) { }
+	@Override public void enterExpr(NCSynonymDslParser.ExprContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLval(NCSynonymDslParser.LvalContext ctx) { }
+	@Override public void exitExpr(NCSynonymDslParser.ExprContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLvalQual(NCSynonymDslParser.LvalQualContext ctx) { }
+	@Override public void enterVal(NCSynonymDslParser.ValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLvalQual(NCSynonymDslParser.LvalQualContext ctx) { }
+	@Override public void exitVal(NCSynonymDslParser.ValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterLvalPart(NCSynonymDslParser.LvalPartContext ctx) { }
+	@Override public void enterSingleVal(NCSynonymDslParser.SingleValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitLvalPart(NCSynonymDslParser.LvalPartContext ctx) { }
+	@Override public void exitSingleVal(NCSynonymDslParser.SingleValContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRvalSingle(NCSynonymDslParser.RvalSingleContext ctx) { }
+	@Override public void enterTokQual(NCSynonymDslParser.TokQualContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRvalSingle(NCSynonymDslParser.RvalSingleContext ctx) { }
+	@Override public void exitTokQual(NCSynonymDslParser.TokQualContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRval(NCSynonymDslParser.RvalContext ctx) { }
+	@Override public void enterTokQualPart(NCSynonymDslParser.TokQualPartContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRval(NCSynonymDslParser.RvalContext ctx) { }
+	@Override public void exitTokQualPart(NCSynonymDslParser.TokQualPartContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterRvalList(NCSynonymDslParser.RvalListContext ctx) { }
+	@Override public void enterTokMeta(NCSynonymDslParser.TokMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitRvalList(NCSynonymDslParser.RvalListContext ctx) { }
+	@Override public void exitTokMeta(NCSynonymDslParser.TokMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void enterMeta(NCSynonymDslParser.MetaContext ctx) { }
+	@Override public void enterModelMeta(NCSynonymDslParser.ModelMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
 	 * <p>The default implementation does nothing.</p>
 	 */
-	@Override public void exitMeta(NCSynonymDslParser.MetaContext ctx) { }
+	@Override public void exitModelMeta(NCSynonymDslParser.ModelMetaContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterIntentMeta(NCSynonymDslParser.IntentMetaContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitIntentMeta(NCSynonymDslParser.IntentMetaContext ctx) { }
 	/**
 	 * {@inheritDoc}
 	 *
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.interp
index 30a8a80..b2c4a40 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.interp
@@ -1,5 +1,6 @@
 token literal names:
 null
+'null'
 'id'
 'aliases'
 'startidx'
@@ -8,7 +9,8 @@ null
 'groups'
 'ancestors'
 'value'
-'null'
+null
+null
 null
 '&&'
 '||'
@@ -16,11 +18,14 @@ null
 '('
 ')'
 '\''
+'"'
+'$'
 '~'
 '['
 ']'
 ','
 ':'
+'#'
 '-'
 '.'
 '_'
@@ -42,6 +47,8 @@ null
 null
 null
 null
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -49,11 +56,14 @@ EXCL
 LPAREN
 RPAREN
 SQUOTE
+DQUOTE
+DOLLAR
 TILDA
 LBR
 RBR
 COMMA
 COLON
+POUND
 MINUS
 DOT
 UNDERSCORE
@@ -74,6 +84,8 @@ T__5
 T__6
 T__7
 T__8
+SQSTRING
+DQSTRING
 PRED_OP
 AND
 OR
@@ -81,11 +93,14 @@ EXCL
 LPAREN
 RPAREN
 SQUOTE
+DQUOTE
+DOLLAR
 TILDA
 LBR
 RBR
 COMMA
 COLON
+POUND
 MINUS
 DOT
 UNDERSCORE
@@ -104,4 +119,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 32, 221, 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, 3, 2, 3, 2 [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 37, 255, 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/probe/mgrs/model/antlr4/NCSynonymDslLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
index 7541d94..461fbae 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
@@ -11,16 +11,17 @@ import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCSynonymDslLexer extends Lexer {
-	static { RuntimeMetaData.checkVersion("4.9", RuntimeMetaData.VERSION); }
+	static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
 
 	protected static final DFA[] _decisionToDFA;
 	protected static final PredictionContextCache _sharedContextCache =
 		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, 
-		PRED_OP=10, AND=11, OR=12, EXCL=13, LPAREN=14, RPAREN=15, SQUOTE=16, TILDA=17, 
-		LBR=18, RBR=19, COMMA=20, COLON=21, MINUS=22, DOT=23, UNDERSCORE=24, BOOL=25, 
-		INT=26, EXP=27, ID=28, WS=29, ErrorCharacter=30;
+		SQSTRING=10, DQSTRING=11, PRED_OP=12, AND=13, OR=14, EXCL=15, LPAREN=16, 
+		RPAREN=17, SQUOTE=18, DQUOTE=19, DOLLAR=20, TILDA=21, LBR=22, RBR=23, 
+		COMMA=24, COLON=25, POUND=26, MINUS=27, DOT=28, UNDERSCORE=29, BOOL=30, 
+		INT=31, EXP=32, ID=33, WS=34, ErrorCharacter=35;
 	public static String[] channelNames = {
 		"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
 	};
@@ -32,27 +33,29 @@ public class NCSynonymDslLexer 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", 
-			"PRED_OP", "AND", "OR", "EXCL", "LPAREN", "RPAREN", "SQUOTE", "TILDA", 
-			"LBR", "RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "BOOL", 
-			"INT", "EXP", "ID", "WS", "ErrorCharacter"
+			"SQSTRING", "DQSTRING", "PRED_OP", "AND", "OR", "EXCL", "LPAREN", "RPAREN", 
+			"SQUOTE", "DQUOTE", "DOLLAR", "TILDA", "LBR", "RBR", "COMMA", "COLON", 
+			"POUND", "MINUS", "DOT", "UNDERSCORE", "BOOL", "INT", "EXP", "ID", "WS", 
+			"ErrorCharacter"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", 
-			"'ancestors'", "'value'", "'null'", null, "'&&'", "'||'", "'!'", "'('", 
-			"')'", "'''", "'~'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'"
+			null, "'null'", "'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", 
+			"'groups'", "'ancestors'", "'value'", null, 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, "PRED_OP", 
-			"AND", "OR", "EXCL", "LPAREN", "RPAREN", "SQUOTE", "TILDA", "LBR", "RBR", 
-			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "BOOL", "INT", "EXP", 
-			"ID", "WS", "ErrorCharacter"
+			null, null, null, null, null, null, null, null, null, null, "SQSTRING", 
+			"DQSTRING", "PRED_OP", "AND", "OR", "EXCL", "LPAREN", "RPAREN", "SQUOTE", 
+			"DQUOTE", "DOLLAR", "TILDA", "LBR", "RBR", "COMMA", "COLON", "POUND", 
+			"MINUS", "DOT", "UNDERSCORE", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -114,77 +117,89 @@ public class NCSynonymDslLexer extends Lexer {
 	public ATN getATN() { return _ATN; }
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2 \u00dd\b\1\4\2\t"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2%\u00ff\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\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\4\3\4\3\4\3\4"+
-		"\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\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\b\3\t\3\t\3\t\3\t"+
-		"\3\t\3\t\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\13\3"+
-		"\13\3\13\3\13\3\13\3\13\5\13\u008b\n\13\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3"+
-		"\16\3\17\3\17\3\20\3\20\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\32\3\32\3"+
-		"\32\3\32\3\32\3\32\5\32\u00b4\n\32\3\33\3\33\3\33\7\33\u00b9\n\33\f\33"+
-		"\16\33\u00bc\13\33\5\33\u00be\n\33\3\34\3\34\6\34\u00c2\n\34\r\34\16\34"+
-		"\u00c3\3\35\3\35\6\35\u00c8\n\35\r\35\16\35\u00c9\3\35\3\35\3\35\3\35"+
-		"\7\35\u00d0\n\35\f\35\16\35\u00d3\13\35\3\36\6\36\u00d6\n\36\r\36\16\36"+
-		"\u00d7\3\36\3\36\3\37\3\37\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= \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\u00ed\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"+
-		"\3?\3\2\2\2\5B\3\2\2\2\7J\3\2\2\2\tS\3\2\2\2\13Z\3\2\2\2\ra\3\2\2\2\17"+
-		"h\3\2\2\2\21r\3\2\2\2\23x\3\2\2\2\25\u008a\3\2\2\2\27\u008c\3\2\2\2\31"+
-		"\u008f\3\2\2\2\33\u0092\3\2\2\2\35\u0094\3\2\2\2\37\u0096\3\2\2\2!\u0098"+
-		"\3\2\2\2#\u009a\3\2\2\2%\u009c\3\2\2\2\'\u009e\3\2\2\2)\u00a0\3\2\2\2"+
-		"+\u00a2\3\2\2\2-\u00a4\3\2\2\2/\u00a6\3\2\2\2\61\u00a8\3\2\2\2\63\u00b3"+
-		"\3\2\2\2\65\u00bd\3\2\2\2\67\u00bf\3\2\2\29\u00c7\3\2\2\2;\u00d5\3\2\2"+
-		"\2=\u00db\3\2\2\2?@\7k\2\2@A\7f\2\2A\4\3\2\2\2BC\7c\2\2CD\7n\2\2DE\7k"+
-		"\2\2EF\7c\2\2FG\7u\2\2GH\7g\2\2HI\7u\2\2I\6\3\2\2\2JK\7u\2\2KL\7v\2\2"+
-		"LM\7c\2\2MN\7t\2\2NO\7v\2\2OP\7k\2\2PQ\7f\2\2QR\7z\2\2R\b\3\2\2\2ST\7"+
-		"g\2\2TU\7p\2\2UV\7f\2\2VW\7k\2\2WX\7f\2\2XY\7z\2\2Y\n\3\2\2\2Z[\7r\2\2"+
-		"[\\\7c\2\2\\]\7t\2\2]^\7g\2\2^_\7p\2\2_`\7v\2\2`\f\3\2\2\2ab\7i\2\2bc"+
-		"\7t\2\2cd\7q\2\2de\7w\2\2ef\7r\2\2fg\7u\2\2g\16\3\2\2\2hi\7c\2\2ij\7p"+
-		"\2\2jk\7e\2\2kl\7g\2\2lm\7u\2\2mn\7v\2\2no\7q\2\2op\7t\2\2pq\7u\2\2q\20"+
-		"\3\2\2\2rs\7x\2\2st\7c\2\2tu\7n\2\2uv\7w\2\2vw\7g\2\2w\22\3\2\2\2xy\7"+
-		"p\2\2yz\7w\2\2z{\7n\2\2{|\7n\2\2|\24\3\2\2\2}~\7?\2\2~\u008b\7?\2\2\177"+
-		"\u0080\7#\2\2\u0080\u008b\7?\2\2\u0081\u0082\7@\2\2\u0082\u008b\7?\2\2"+
-		"\u0083\u0084\7>\2\2\u0084\u008b\7?\2\2\u0085\u008b\t\2\2\2\u0086\u0087"+
-		"\7B\2\2\u0087\u008b\7B\2\2\u0088\u0089\7#\2\2\u0089\u008b\7B\2\2\u008a"+
-		"}\3\2\2\2\u008a\177\3\2\2\2\u008a\u0081\3\2\2\2\u008a\u0083\3\2\2\2\u008a"+
-		"\u0085\3\2\2\2\u008a\u0086\3\2\2\2\u008a\u0088\3\2\2\2\u008b\26\3\2\2"+
-		"\2\u008c\u008d\7(\2\2\u008d\u008e\7(\2\2\u008e\30\3\2\2\2\u008f\u0090"+
-		"\7~\2\2\u0090\u0091\7~\2\2\u0091\32\3\2\2\2\u0092\u0093\7#\2\2\u0093\34"+
-		"\3\2\2\2\u0094\u0095\7*\2\2\u0095\36\3\2\2\2\u0096\u0097\7+\2\2\u0097"+
-		" \3\2\2\2\u0098\u0099\7)\2\2\u0099\"\3\2\2\2\u009a\u009b\7\u0080\2\2\u009b"+
-		"$\3\2\2\2\u009c\u009d\7]\2\2\u009d&\3\2\2\2\u009e\u009f\7_\2\2\u009f("+
-		"\3\2\2\2\u00a0\u00a1\7.\2\2\u00a1*\3\2\2\2\u00a2\u00a3\7<\2\2\u00a3,\3"+
-		"\2\2\2\u00a4\u00a5\7/\2\2\u00a5.\3\2\2\2\u00a6\u00a7\7\60\2\2\u00a7\60"+
-		"\3\2\2\2\u00a8\u00a9\7a\2\2\u00a9\62\3\2\2\2\u00aa\u00ab\7v\2\2\u00ab"+
-		"\u00ac\7t\2\2\u00ac\u00ad\7w\2\2\u00ad\u00b4\7g\2\2\u00ae\u00af\7h\2\2"+
-		"\u00af\u00b0\7c\2\2\u00b0\u00b1\7n\2\2\u00b1\u00b2\7u\2\2\u00b2\u00b4"+
-		"\7g\2\2\u00b3\u00aa\3\2\2\2\u00b3\u00ae\3\2\2\2\u00b4\64\3\2\2\2\u00b5"+
-		"\u00be\7\62\2\2\u00b6\u00ba\t\3\2\2\u00b7\u00b9\t\4\2\2\u00b8\u00b7\3"+
-		"\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb"+
-		"\u00be\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bd\u00b5\3\2\2\2\u00bd\u00b6\3\2"+
-		"\2\2\u00be\66\3\2\2\2\u00bf\u00c1\5/\30\2\u00c0\u00c2\t\5\2\2\u00c1\u00c0"+
-		"\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c1\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4"+
-		"8\3\2\2\2\u00c5\u00c8\5\61\31\2\u00c6\u00c8\t\6\2\2\u00c7\u00c5\3\2\2"+
-		"\2\u00c7\u00c6\3\2\2\2\u00c8\u00c9\3\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00ca"+
-		"\3\2\2\2\u00ca\u00d1\3\2\2\2\u00cb\u00d0\t\7\2\2\u00cc\u00d0\5+\26\2\u00cd"+
-		"\u00d0\5-\27\2\u00ce\u00d0\5\61\31\2\u00cf\u00cb\3\2\2\2\u00cf\u00cc\3"+
-		"\2\2\2\u00cf\u00cd\3\2\2\2\u00cf\u00ce\3\2\2\2\u00d0\u00d3\3\2\2\2\u00d1"+
-		"\u00cf\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2:\3\2\2\2\u00d3\u00d1\3\2\2\2"+
-		"\u00d4\u00d6\t\b\2\2\u00d5\u00d4\3\2\2\2\u00d6\u00d7\3\2\2\2\u00d7\u00d5"+
-		"\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00da\b\36\2\2"+
-		"\u00da<\3\2\2\2\u00db\u00dc\13\2\2\2\u00dc>\3\2\2\2\r\2\u008a\u00b3\u00ba"+
-		"\u00bd\u00c3\u00c7\u00c9\u00cf\u00d1\u00d7\3\b\2\2";
+		"\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$\3\2\3\2\3\2\3\2\3\2\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\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+
+		"\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\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\t\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3"+
+		"\13\7\13\u008a\n\13\f\13\16\13\u008d\13\13\3\13\3\13\3\f\3\f\7\f\u0093"+
+		"\n\f\f\f\16\f\u0096\13\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\r\3\r\3\r\5\r\u00a7\n\r\3\16\3\16\3\16\3\17\3\17\3\17\3\20\3\20\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\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3"+
+		"\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u00d6\n\37\3 \3 \3 \7"+
+		" \u00db\n \f \16 \u00de\13 \5 \u00e0\n \3!\3!\6!\u00e4\n!\r!\16!\u00e5"+
+		"\3\"\3\"\6\"\u00ea\n\"\r\"\16\"\u00eb\3\"\3\"\3\"\3\"\7\"\u00f2\n\"\f"+
+		"\"\16\"\u00f5\13\"\3#\6#\u00f8\n#\r#\16#\u00f9\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%\3\2\13\3\2))\3\2$$\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\u0111\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\3I\3\2\2\2\5N\3\2\2\2\7Q"+
+		"\3\2\2\2\tY\3\2\2\2\13b\3\2\2\2\ri\3\2\2\2\17p\3\2\2\2\21w\3\2\2\2\23"+
+		"\u0081\3\2\2\2\25\u0087\3\2\2\2\27\u0090\3\2\2\2\31\u00a6\3\2\2\2\33\u00a8"+
+		"\3\2\2\2\35\u00ab\3\2\2\2\37\u00ae\3\2\2\2!\u00b0\3\2\2\2#\u00b2\3\2\2"+
+		"\2%\u00b4\3\2\2\2\'\u00b6\3\2\2\2)\u00b8\3\2\2\2+\u00ba\3\2\2\2-\u00bc"+
+		"\3\2\2\2/\u00be\3\2\2\2\61\u00c0\3\2\2\2\63\u00c2\3\2\2\2\65\u00c4\3\2"+
+		"\2\2\67\u00c6\3\2\2\29\u00c8\3\2\2\2;\u00ca\3\2\2\2=\u00d5\3\2\2\2?\u00df"+
+		"\3\2\2\2A\u00e1\3\2\2\2C\u00e9\3\2\2\2E\u00f7\3\2\2\2G\u00fd\3\2\2\2I"+
+		"J\7p\2\2JK\7w\2\2KL\7n\2\2LM\7n\2\2M\4\3\2\2\2NO\7k\2\2OP\7f\2\2P\6\3"+
+		"\2\2\2QR\7c\2\2RS\7n\2\2ST\7k\2\2TU\7c\2\2UV\7u\2\2VW\7g\2\2WX\7u\2\2"+
+		"X\b\3\2\2\2YZ\7u\2\2Z[\7v\2\2[\\\7c\2\2\\]\7t\2\2]^\7v\2\2^_\7k\2\2_`"+
+		"\7f\2\2`a\7z\2\2a\n\3\2\2\2bc\7g\2\2cd\7p\2\2de\7f\2\2ef\7k\2\2fg\7f\2"+
+		"\2gh\7z\2\2h\f\3\2\2\2ij\7r\2\2jk\7c\2\2kl\7t\2\2lm\7g\2\2mn\7p\2\2no"+
+		"\7v\2\2o\16\3\2\2\2pq\7i\2\2qr\7t\2\2rs\7q\2\2st\7w\2\2tu\7r\2\2uv\7u"+
+		"\2\2v\20\3\2\2\2wx\7c\2\2xy\7p\2\2yz\7e\2\2z{\7g\2\2{|\7u\2\2|}\7v\2\2"+
+		"}~\7q\2\2~\177\7t\2\2\177\u0080\7u\2\2\u0080\22\3\2\2\2\u0081\u0082\7"+
+		"x\2\2\u0082\u0083\7c\2\2\u0083\u0084\7n\2\2\u0084\u0085\7w\2\2\u0085\u0086"+
+		"\7g\2\2\u0086\24\3\2\2\2\u0087\u008b\5%\23\2\u0088\u008a\n\2\2\2\u0089"+
+		"\u0088\3\2\2\2\u008a\u008d\3\2\2\2\u008b\u0089\3\2\2\2\u008b\u008c\3\2"+
+		"\2\2\u008c\u008e\3\2\2\2\u008d\u008b\3\2\2\2\u008e\u008f\5%\23\2\u008f"+
+		"\26\3\2\2\2\u0090\u0094\5\'\24\2\u0091\u0093\n\3\2\2\u0092\u0091\3\2\2"+
+		"\2\u0093\u0096\3\2\2\2\u0094\u0092\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0097"+
+		"\3\2\2\2\u0096\u0094\3\2\2\2\u0097\u0098\5\'\24\2\u0098\30\3\2\2\2\u0099"+
+		"\u009a\7?\2\2\u009a\u00a7\7?\2\2\u009b\u009c\7#\2\2\u009c\u00a7\7?\2\2"+
+		"\u009d\u009e\7@\2\2\u009e\u00a7\7?\2\2\u009f\u00a0\7>\2\2\u00a0\u00a7"+
+		"\7?\2\2\u00a1\u00a7\t\4\2\2\u00a2\u00a3\7B\2\2\u00a3\u00a7\7B\2\2\u00a4"+
+		"\u00a5\7#\2\2\u00a5\u00a7\7B\2\2\u00a6\u0099\3\2\2\2\u00a6\u009b\3\2\2"+
+		"\2\u00a6\u009d\3\2\2\2\u00a6\u009f\3\2\2\2\u00a6\u00a1\3\2\2\2\u00a6\u00a2"+
+		"\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7\32\3\2\2\2\u00a8\u00a9\7(\2\2\u00a9"+
+		"\u00aa\7(\2\2\u00aa\34\3\2\2\2\u00ab\u00ac\7~\2\2\u00ac\u00ad\7~\2\2\u00ad"+
+		"\36\3\2\2\2\u00ae\u00af\7#\2\2\u00af \3\2\2\2\u00b0\u00b1\7*\2\2\u00b1"+
+		"\"\3\2\2\2\u00b2\u00b3\7+\2\2\u00b3$\3\2\2\2\u00b4\u00b5\7)\2\2\u00b5"+
+		"&\3\2\2\2\u00b6\u00b7\7$\2\2\u00b7(\3\2\2\2\u00b8\u00b9\7&\2\2\u00b9*"+
+		"\3\2\2\2\u00ba\u00bb\7\u0080\2\2\u00bb,\3\2\2\2\u00bc\u00bd\7]\2\2\u00bd"+
+		".\3\2\2\2\u00be\u00bf\7_\2\2\u00bf\60\3\2\2\2\u00c0\u00c1\7.\2\2\u00c1"+
+		"\62\3\2\2\2\u00c2\u00c3\7<\2\2\u00c3\64\3\2\2\2\u00c4\u00c5\7%\2\2\u00c5"+
+		"\66\3\2\2\2\u00c6\u00c7\7/\2\2\u00c78\3\2\2\2\u00c8\u00c9\7\60\2\2\u00c9"+
+		":\3\2\2\2\u00ca\u00cb\7a\2\2\u00cb<\3\2\2\2\u00cc\u00cd\7v\2\2\u00cd\u00ce"+
+		"\7t\2\2\u00ce\u00cf\7w\2\2\u00cf\u00d6\7g\2\2\u00d0\u00d1\7h\2\2\u00d1"+
+		"\u00d2\7c\2\2\u00d2\u00d3\7n\2\2\u00d3\u00d4\7u\2\2\u00d4\u00d6\7g\2\2"+
+		"\u00d5\u00cc\3\2\2\2\u00d5\u00d0\3\2\2\2\u00d6>\3\2\2\2\u00d7\u00e0\7"+
+		"\62\2\2\u00d8\u00dc\t\5\2\2\u00d9\u00db\t\6\2\2\u00da\u00d9\3\2\2\2\u00db"+
+		"\u00de\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00e0\3\2"+
+		"\2\2\u00de\u00dc\3\2\2\2\u00df\u00d7\3\2\2\2\u00df\u00d8\3\2\2\2\u00e0"+
+		"@\3\2\2\2\u00e1\u00e3\59\35\2\u00e2\u00e4\t\7\2\2\u00e3\u00e2\3\2\2\2"+
+		"\u00e4\u00e5\3\2\2\2\u00e5\u00e3\3\2\2\2\u00e5\u00e6\3\2\2\2\u00e6B\3"+
+		"\2\2\2\u00e7\u00ea\5;\36\2\u00e8\u00ea\t\b\2\2\u00e9\u00e7\3\2\2\2\u00e9"+
+		"\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00e9\3\2\2\2\u00eb\u00ec\3\2"+
+		"\2\2\u00ec\u00f3\3\2\2\2\u00ed\u00f2\t\t\2\2\u00ee\u00f2\5\63\32\2\u00ef"+
+		"\u00f2\5\67\34\2\u00f0\u00f2\5;\36\2\u00f1\u00ed\3\2\2\2\u00f1\u00ee\3"+
+		"\2\2\2\u00f1\u00ef\3\2\2\2\u00f1\u00f0\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3"+
+		"\u00f1\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4D\3\2\2\2\u00f5\u00f3\3\2\2\2"+
+		"\u00f6\u00f8\t\n\2\2\u00f7\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00f7"+
+		"\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fc\b#\2\2\u00fc"+
+		"F\3\2\2\2\u00fd\u00fe\13\2\2\2\u00feH\3\2\2\2\17\2\u008b\u0094\u00a6\u00d5"+
+		"\u00dc\u00df\u00e5\u00e9\u00eb\u00f1\u00f3\u00f9\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/probe/mgrs/model/antlr4/NCSynonymDslLexer.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.tokens
index 06f8bf7..7d51b56 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslLexer.tokens
@@ -7,47 +7,55 @@ T__5=6
 T__6=7
 T__7=8
 T__8=9
-PRED_OP=10
-AND=11
-OR=12
-EXCL=13
-LPAREN=14
-RPAREN=15
-SQUOTE=16
-TILDA=17
-LBR=18
-RBR=19
-COMMA=20
-COLON=21
-MINUS=22
-DOT=23
-UNDERSCORE=24
-BOOL=25
-INT=26
-EXP=27
-ID=28
-WS=29
-ErrorCharacter=30
-'id'=1
-'aliases'=2
-'startidx'=3
-'endidx'=4
-'parent'=5
-'groups'=6
-'ancestors'=7
-'value'=8
-'null'=9
-'&&'=11
-'||'=12
-'!'=13
-'('=14
-')'=15
-'\''=16
-'~'=17
-'['=18
-']'=19
-','=20
-':'=21
-'-'=22
-'.'=23
-'_'=24
+SQSTRING=10
+DQSTRING=11
+PRED_OP=12
+AND=13
+OR=14
+EXCL=15
+LPAREN=16
+RPAREN=17
+SQUOTE=18
+DQUOTE=19
+DOLLAR=20
+TILDA=21
+LBR=22
+RBR=23
+COMMA=24
+COLON=25
+POUND=26
+MINUS=27
+DOT=28
+UNDERSCORE=29
+BOOL=30
+INT=31
+EXP=32
+ID=33
+WS=34
+ErrorCharacter=35
+'null'=1
+'id'=2
+'aliases'=3
+'startidx'=4
+'endidx'=5
+'parent'=6
+'groups'=7
+'ancestors'=8
+'value'=9
+'&&'=13
+'||'=14
+'!'=15
+'('=16
+')'=17
+'\''=18
+'"'=19
+'$'=20
+'~'=21
+'['=22
+']'=23
+','=24
+':'=25
+'#'=26
+'-'=27
+'.'=28
+'_'=29
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
index 19459aa..a22ba9a 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslListener.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
@@ -38,85 +38,95 @@ public interface NCSynonymDslListener extends ParseTreeListener {
 	 */
 	void exitItem(NCSynonymDslParser.ItemContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#predicate}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#pred}.
 	 * @param ctx the parse tree
 	 */
-	void enterPredicate(NCSynonymDslParser.PredicateContext ctx);
+	void enterPred(NCSynonymDslParser.PredContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#predicate}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#pred}.
 	 * @param ctx the parse tree
 	 */
-	void exitPredicate(NCSynonymDslParser.PredicateContext ctx);
+	void exitPred(NCSynonymDslParser.PredContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#lval}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#expr}.
 	 * @param ctx the parse tree
 	 */
-	void enterLval(NCSynonymDslParser.LvalContext ctx);
+	void enterExpr(NCSynonymDslParser.ExprContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#lval}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#expr}.
 	 * @param ctx the parse tree
 	 */
-	void exitLval(NCSynonymDslParser.LvalContext ctx);
+	void exitExpr(NCSynonymDslParser.ExprContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#lvalQual}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#val}.
 	 * @param ctx the parse tree
 	 */
-	void enterLvalQual(NCSynonymDslParser.LvalQualContext ctx);
+	void enterVal(NCSynonymDslParser.ValContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#lvalQual}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#val}.
 	 * @param ctx the parse tree
 	 */
-	void exitLvalQual(NCSynonymDslParser.LvalQualContext ctx);
+	void exitVal(NCSynonymDslParser.ValContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#lvalPart}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#singleVal}.
 	 * @param ctx the parse tree
 	 */
-	void enterLvalPart(NCSynonymDslParser.LvalPartContext ctx);
+	void enterSingleVal(NCSynonymDslParser.SingleValContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#lvalPart}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#singleVal}.
 	 * @param ctx the parse tree
 	 */
-	void exitLvalPart(NCSynonymDslParser.LvalPartContext ctx);
+	void exitSingleVal(NCSynonymDslParser.SingleValContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#rvalSingle}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#tokQual}.
 	 * @param ctx the parse tree
 	 */
-	void enterRvalSingle(NCSynonymDslParser.RvalSingleContext ctx);
+	void enterTokQual(NCSynonymDslParser.TokQualContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#rvalSingle}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#tokQual}.
 	 * @param ctx the parse tree
 	 */
-	void exitRvalSingle(NCSynonymDslParser.RvalSingleContext ctx);
+	void exitTokQual(NCSynonymDslParser.TokQualContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#rval}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#tokQualPart}.
 	 * @param ctx the parse tree
 	 */
-	void enterRval(NCSynonymDslParser.RvalContext ctx);
+	void enterTokQualPart(NCSynonymDslParser.TokQualPartContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#rval}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#tokQualPart}.
 	 * @param ctx the parse tree
 	 */
-	void exitRval(NCSynonymDslParser.RvalContext ctx);
+	void exitTokQualPart(NCSynonymDslParser.TokQualPartContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#rvalList}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#tokMeta}.
 	 * @param ctx the parse tree
 	 */
-	void enterRvalList(NCSynonymDslParser.RvalListContext ctx);
+	void enterTokMeta(NCSynonymDslParser.TokMetaContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#rvalList}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#tokMeta}.
 	 * @param ctx the parse tree
 	 */
-	void exitRvalList(NCSynonymDslParser.RvalListContext ctx);
+	void exitTokMeta(NCSynonymDslParser.TokMetaContext ctx);
 	/**
-	 * Enter a parse tree produced by {@link NCSynonymDslParser#meta}.
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#modelMeta}.
 	 * @param ctx the parse tree
 	 */
-	void enterMeta(NCSynonymDslParser.MetaContext ctx);
+	void enterModelMeta(NCSynonymDslParser.ModelMetaContext ctx);
 	/**
-	 * Exit a parse tree produced by {@link NCSynonymDslParser#meta}.
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#modelMeta}.
 	 * @param ctx the parse tree
 	 */
-	void exitMeta(NCSynonymDslParser.MetaContext ctx);
+	void exitModelMeta(NCSynonymDslParser.ModelMetaContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link NCSynonymDslParser#intentMeta}.
+	 * @param ctx the parse tree
+	 */
+	void enterIntentMeta(NCSynonymDslParser.IntentMetaContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link NCSynonymDslParser#intentMeta}.
+	 * @param ctx the parse tree
+	 */
+	void exitIntentMeta(NCSynonymDslParser.IntentMetaContext ctx);
 	/**
 	 * Enter a parse tree produced by {@link NCSynonymDslParser#qstring}.
 	 * @param ctx the parse tree
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
index 68f91fe..ea65684 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4/NCSynonymDslParser.java
@@ -1,4 +1,4 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/antlr4\NCSynonymDsl.g4 by ANTLR 4.9.1
 package org.apache.nlpcraft.probe.mgrs.model.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
@@ -11,42 +11,44 @@ import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCSynonymDslParser extends Parser {
-	static { RuntimeMetaData.checkVersion("4.9", RuntimeMetaData.VERSION); }
+	static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); }
 
 	protected static final DFA[] _decisionToDFA;
 	protected static final PredictionContextCache _sharedContextCache =
 		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, 
-		PRED_OP=10, AND=11, OR=12, EXCL=13, LPAREN=14, RPAREN=15, SQUOTE=16, TILDA=17, 
-		LBR=18, RBR=19, COMMA=20, COLON=21, MINUS=22, DOT=23, UNDERSCORE=24, BOOL=25, 
-		INT=26, EXP=27, ID=28, WS=29, ErrorCharacter=30;
+		SQSTRING=10, DQSTRING=11, PRED_OP=12, AND=13, OR=14, EXCL=15, LPAREN=16, 
+		RPAREN=17, SQUOTE=18, DQUOTE=19, DOLLAR=20, TILDA=21, LBR=22, RBR=23, 
+		COMMA=24, COLON=25, POUND=26, MINUS=27, DOT=28, UNDERSCORE=29, BOOL=30, 
+		INT=31, EXP=32, ID=33, WS=34, ErrorCharacter=35;
 	public static final int
-		RULE_synonym = 0, RULE_alias = 1, RULE_item = 2, RULE_predicate = 3, RULE_lval = 4, 
-		RULE_lvalQual = 5, RULE_lvalPart = 6, RULE_rvalSingle = 7, RULE_rval = 8, 
-		RULE_rvalList = 9, RULE_meta = 10, RULE_qstring = 11;
+		RULE_synonym = 0, RULE_alias = 1, RULE_item = 2, RULE_pred = 3, RULE_expr = 4, 
+		RULE_val = 5, RULE_singleVal = 6, RULE_tokQual = 7, RULE_tokQualPart = 8, 
+		RULE_tokMeta = 9, RULE_modelMeta = 10, RULE_intentMeta = 11, RULE_qstring = 12;
 	private static String[] makeRuleNames() {
 		return new String[] {
-			"synonym", "alias", "item", "predicate", "lval", "lvalQual", "lvalPart", 
-			"rvalSingle", "rval", "rvalList", "meta", "qstring"
+			"synonym", "alias", "item", "pred", "expr", "val", "singleVal", "tokQual", 
+			"tokQualPart", "tokMeta", "modelMeta", "intentMeta", "qstring"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
 
 	private static String[] makeLiteralNames() {
 		return new String[] {
-			null, "'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", "'groups'", 
-			"'ancestors'", "'value'", "'null'", null, "'&&'", "'||'", "'!'", "'('", 
-			"')'", "'''", "'~'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'"
+			null, "'null'", "'id'", "'aliases'", "'startidx'", "'endidx'", "'parent'", 
+			"'groups'", "'ancestors'", "'value'", null, 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, "PRED_OP", 
-			"AND", "OR", "EXCL", "LPAREN", "RPAREN", "SQUOTE", "TILDA", "LBR", "RBR", 
-			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "BOOL", "INT", "EXP", 
-			"ID", "WS", "ErrorCharacter"
+			null, null, null, null, null, null, null, null, null, null, "SQSTRING", 
+			"DQSTRING", "PRED_OP", "AND", "OR", "EXCL", "LPAREN", "RPAREN", "SQUOTE", 
+			"DQUOTE", "DOLLAR", "TILDA", "LBR", "RBR", "COMMA", "COLON", "POUND", 
+			"MINUS", "DOT", "UNDERSCORE", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -128,21 +130,21 @@ public class NCSynonymDslParser extends Parser {
 		SynonymContext _localctx = new SynonymContext(_ctx, getState());
 		enterRule(_localctx, 0, RULE_synonym);
 		try {
-			setState(33);
+			setState(35);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case LBR:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(24);
+				setState(26);
 				alias();
-				setState(25);
+				setState(27);
 				match(LPAREN);
-				setState(26);
+				setState(28);
 				item(0);
-				setState(27);
+				setState(29);
 				match(RPAREN);
-				setState(28);
+				setState(30);
 				match(EOF);
 				}
 				break;
@@ -154,15 +156,23 @@ public class NCSynonymDslParser extends Parser {
 			case T__5:
 			case T__6:
 			case T__7:
+			case T__8:
+			case SQSTRING:
+			case DQSTRING:
 			case EXCL:
 			case LPAREN:
+			case DOLLAR:
 			case TILDA:
+			case POUND:
+			case MINUS:
+			case BOOL:
+			case INT:
 			case ID:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(30);
+				setState(32);
 				item(0);
-				setState(31);
+				setState(33);
 				match(EOF);
 				}
 				break;
@@ -205,11 +215,11 @@ public class NCSynonymDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(35);
+			setState(37);
 			match(LBR);
-			setState(36);
+			setState(38);
 			match(ID);
-			setState(37);
+			setState(39);
 			match(RBR);
 			}
 		}
@@ -225,8 +235,8 @@ public class NCSynonymDslParser extends Parser {
 	}
 
 	public static class ItemContext extends ParserRuleContext {
-		public PredicateContext predicate() {
-			return getRuleContext(PredicateContext.class,0);
+		public PredContext pred() {
+			return getRuleContext(PredContext.class,0);
 		}
 		public TerminalNode LPAREN() { return getToken(NCSynonymDslParser.LPAREN, 0); }
 		public List<ItemContext> item() {
@@ -269,47 +279,36 @@ public class NCSynonymDslParser extends Parser {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(47);
+			setState(49);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__0:
-			case T__1:
-			case T__2:
-			case T__3:
-			case T__4:
-			case T__5:
-			case T__6:
-			case T__7:
-			case TILDA:
-			case ID:
+			switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) {
+			case 1:
 				{
-				setState(40);
-				predicate();
+				setState(42);
+				pred();
 				}
 				break;
-			case LPAREN:
+			case 2:
 				{
-				setState(41);
+				setState(43);
 				match(LPAREN);
-				setState(42);
+				setState(44);
 				item(0);
-				setState(43);
+				setState(45);
 				match(RPAREN);
 				}
 				break;
-			case EXCL:
+			case 3:
 				{
-				setState(45);
+				setState(47);
 				match(EXCL);
-				setState(46);
+				setState(48);
 				item(1);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(54);
+			setState(56);
 			_errHandler.sync(this);
 			_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -320,9 +319,9 @@ public class NCSynonymDslParser extends Parser {
 					{
 					_localctx = new ItemContext(_parentctx, _parentState);
 					pushNewRecursionContext(_localctx, _startState, RULE_item);
-					setState(49);
+					setState(51);
 					if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
-					setState(50);
+					setState(52);
 					_la = _input.LA(1);
 					if ( !(_la==AND || _la==OR) ) {
 					_errHandler.recoverInline(this);
@@ -332,12 +331,12 @@ public class NCSynonymDslParser extends Parser {
 						_errHandler.reportMatch(this);
 						consume();
 					}
-					setState(51);
+					setState(53);
 					item(3);
 					}
 					} 
 				}
-				setState(56);
+				setState(58);
 				_errHandler.sync(this);
 				_alt = getInterpreter().adaptivePredict(_input,2,_ctx);
 			}
@@ -354,64 +353,102 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class PredicateContext extends ParserRuleContext {
-		public LvalContext lval() {
-			return getRuleContext(LvalContext.class,0);
+	public static class PredContext extends ParserRuleContext {
+		public List<ExprContext> expr() {
+			return getRuleContexts(ExprContext.class);
+		}
+		public ExprContext expr(int i) {
+			return getRuleContext(ExprContext.class,i);
 		}
 		public TerminalNode PRED_OP() { return getToken(NCSynonymDslParser.PRED_OP, 0); }
-		public RvalContext rval() {
-			return getRuleContext(RvalContext.class,0);
+		public PredContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_pred; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterPred(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitPred(this);
+		}
+	}
+
+	public final PredContext pred() throws RecognitionException {
+		PredContext _localctx = new PredContext(_ctx, getState());
+		enterRule(_localctx, 6, RULE_pred);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(59);
+			expr();
+			setState(60);
+			match(PRED_OP);
+			setState(61);
+			expr();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExprContext extends ParserRuleContext {
+		public ValContext val() {
+			return getRuleContext(ValContext.class,0);
 		}
 		public TerminalNode ID() { return getToken(NCSynonymDslParser.ID, 0); }
 		public TerminalNode LPAREN() { return getToken(NCSynonymDslParser.LPAREN, 0); }
+		public ExprContext expr() {
+			return getRuleContext(ExprContext.class,0);
+		}
 		public TerminalNode RPAREN() { return getToken(NCSynonymDslParser.RPAREN, 0); }
-		public PredicateContext(ParserRuleContext parent, int invokingState) {
+		public ExprContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_predicate; }
+		@Override public int getRuleIndex() { return RULE_expr; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterPredicate(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterExpr(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitPredicate(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitExpr(this);
 		}
 	}
 
-	public final PredicateContext predicate() throws RecognitionException {
-		PredicateContext _localctx = new PredicateContext(_ctx, getState());
-		enterRule(_localctx, 6, RULE_predicate);
+	public final ExprContext expr() throws RecognitionException {
+		ExprContext _localctx = new ExprContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_expr);
 		try {
-			setState(68);
+			setState(69);
 			_errHandler.sync(this);
 			switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(57);
-				lval();
-				setState(58);
-				match(PRED_OP);
-				setState(59);
-				rval();
+				setState(63);
+				val(0);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(61);
-				match(ID);
-				setState(62);
-				match(LPAREN);
-				setState(63);
-				lval();
 				setState(64);
-				match(RPAREN);
+				match(ID);
 				setState(65);
-				match(PRED_OP);
+				match(LPAREN);
 				setState(66);
-				rval();
+				expr();
+				setState(67);
+				match(RPAREN);
 				}
 				break;
 			}
@@ -427,104 +464,277 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalContext extends ParserRuleContext {
-		public MetaContext meta() {
-			return getRuleContext(MetaContext.class,0);
+	public static class ValContext extends ParserRuleContext {
+		public SingleValContext singleVal() {
+			return getRuleContext(SingleValContext.class,0);
 		}
-		public LvalQualContext lvalQual() {
-			return getRuleContext(LvalQualContext.class,0);
+		public TerminalNode LPAREN() { return getToken(NCSynonymDslParser.LPAREN, 0); }
+		public List<ValContext> val() {
+			return getRuleContexts(ValContext.class);
 		}
-		public LvalContext(ParserRuleContext parent, int invokingState) {
+		public ValContext val(int i) {
+			return getRuleContext(ValContext.class,i);
+		}
+		public TerminalNode RPAREN() { return getToken(NCSynonymDslParser.RPAREN, 0); }
+		public TerminalNode COMMA() { return getToken(NCSynonymDslParser.COMMA, 0); }
+		public ValContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lval; }
+		@Override public int getRuleIndex() { return RULE_val; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterLval(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterVal(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLval(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitVal(this);
 		}
 	}
 
-	public final LvalContext lval() throws RecognitionException {
-		LvalContext _localctx = new LvalContext(_ctx, getState());
-		enterRule(_localctx, 8, RULE_lval);
-		int _la;
+	public final ValContext val() throws RecognitionException {
+		return val(0);
+	}
+
+	private ValContext val(int _p) throws RecognitionException {
+		ParserRuleContext _parentctx = _ctx;
+		int _parentState = getState();
+		ValContext _localctx = new ValContext(_ctx, _parentState);
+		ValContext _prevctx = _localctx;
+		int _startState = 10;
+		enterRecursionRule(_localctx, 10, RULE_val, _p);
 		try {
+			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(71);
+			setState(77);
 			_errHandler.sync(this);
-			_la = _input.LA(1);
-			if (_la==ID) {
+			switch (_input.LA(1)) {
+			case T__0:
+			case T__1:
+			case T__2:
+			case T__3:
+			case T__4:
+			case T__5:
+			case T__6:
+			case T__7:
+			case T__8:
+			case SQSTRING:
+			case DQSTRING:
+			case DOLLAR:
+			case TILDA:
+			case POUND:
+			case MINUS:
+			case BOOL:
+			case INT:
+			case ID:
 				{
-				setState(70);
-				lvalQual(0);
+				setState(72);
+				singleVal();
 				}
+				break;
+			case LPAREN:
+				{
+				setState(73);
+				match(LPAREN);
+				setState(74);
+				val(0);
+				setState(75);
+				match(RPAREN);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			_ctx.stop = _input.LT(-1);
+			setState(84);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,5,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					if ( _parseListeners!=null ) triggerExitRuleEvent();
+					_prevctx = _localctx;
+					{
+					{
+					_localctx = new ValContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_val);
+					setState(79);
+					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
+					setState(80);
+					match(COMMA);
+					setState(81);
+					val(2);
+					}
+					} 
+				}
+				setState(86);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,5,_ctx);
+			}
 			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			unrollRecursionContexts(_parentctx);
+		}
+		return _localctx;
+	}
+
+	public static class SingleValContext extends ParserRuleContext {
+		public TerminalNode INT() { return getToken(NCSynonymDslParser.INT, 0); }
+		public TerminalNode EXP() { return getToken(NCSynonymDslParser.EXP, 0); }
+		public TerminalNode MINUS() { return getToken(NCSynonymDslParser.MINUS, 0); }
+		public TerminalNode BOOL() { return getToken(NCSynonymDslParser.BOOL, 0); }
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
+		}
+		public TokQualContext tokQual() {
+			return getRuleContext(TokQualContext.class,0);
+		}
+		public TokMetaContext tokMeta() {
+			return getRuleContext(TokMetaContext.class,0);
+		}
+		public ModelMetaContext modelMeta() {
+			return getRuleContext(ModelMetaContext.class,0);
+		}
+		public IntentMetaContext intentMeta() {
+			return getRuleContext(IntentMetaContext.class,0);
+		}
+		public SingleValContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_singleVal; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterSingleVal(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitSingleVal(this);
+		}
+	}
 
-			setState(82);
+	public final SingleValContext singleVal() throws RecognitionException {
+		SingleValContext _localctx = new SingleValContext(_ctx, getState());
+		enterRule(_localctx, 12, RULE_singleVal);
+		int _la;
+		try {
+			setState(108);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__0:
+			switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
 				{
-				setState(73);
+				setState(87);
 				match(T__0);
 				}
 				break;
-			case T__1:
+			case 2:
+				enterOuterAlt(_localctx, 2);
 				{
-				setState(74);
-				match(T__1);
+				setState(89);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==MINUS) {
+					{
+					setState(88);
+					match(MINUS);
+					}
+				}
+
+				setState(94);
+				_errHandler.sync(this);
+				switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) {
+				case 1:
+					{
+					setState(91);
+					match(INT);
+					}
+					break;
+				case 2:
+					{
+					setState(92);
+					match(INT);
+					setState(93);
+					match(EXP);
+					}
+					break;
 				}
-				break;
-			case T__2:
-				{
-				setState(75);
-				match(T__2);
 				}
 				break;
-			case T__3:
+			case 3:
+				enterOuterAlt(_localctx, 3);
 				{
-				setState(76);
-				match(T__3);
+				setState(96);
+				match(BOOL);
 				}
 				break;
-			case T__4:
+			case 4:
+				enterOuterAlt(_localctx, 4);
 				{
-				setState(77);
-				match(T__4);
+				setState(97);
+				qstring();
 				}
 				break;
-			case T__5:
+			case 5:
+				enterOuterAlt(_localctx, 5);
 				{
-				setState(78);
-				match(T__5);
+				setState(99);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==ID) {
+					{
+					setState(98);
+					tokQual(0);
+					}
+				}
+
+				setState(101);
+				_la = _input.LA(1);
+				if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8))) != 0)) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
 				}
 				break;
-			case T__6:
+			case 6:
+				enterOuterAlt(_localctx, 6);
 				{
-				setState(79);
-				match(T__6);
+				setState(103);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==ID) {
+					{
+					setState(102);
+					tokQual(0);
+					}
+				}
+
+				setState(105);
+				tokMeta();
 				}
 				break;
-			case T__7:
+			case 7:
+				enterOuterAlt(_localctx, 7);
 				{
-				setState(80);
-				match(T__7);
+				setState(106);
+				modelMeta();
 				}
 				break;
-			case TILDA:
+			case 8:
+				enterOuterAlt(_localctx, 8);
 				{
-				setState(81);
-				meta();
+				setState(107);
+				intentMeta();
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
-			}
 			}
 		}
 		catch (RecognitionException re) {
@@ -538,68 +748,68 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalQualContext extends ParserRuleContext {
-		public LvalPartContext lvalPart() {
-			return getRuleContext(LvalPartContext.class,0);
+	public static class TokQualContext extends ParserRuleContext {
+		public TokQualPartContext tokQualPart() {
+			return getRuleContext(TokQualPartContext.class,0);
 		}
-		public LvalQualContext lvalQual() {
-			return getRuleContext(LvalQualContext.class,0);
+		public TokQualContext tokQual() {
+			return getRuleContext(TokQualContext.class,0);
 		}
-		public LvalQualContext(ParserRuleContext parent, int invokingState) {
+		public TokQualContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lvalQual; }
+		@Override public int getRuleIndex() { return RULE_tokQual; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterLvalQual(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterTokQual(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLvalQual(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitTokQual(this);
 		}
 	}
 
-	public final LvalQualContext lvalQual() throws RecognitionException {
-		return lvalQual(0);
+	public final TokQualContext tokQual() throws RecognitionException {
+		return tokQual(0);
 	}
 
-	private LvalQualContext lvalQual(int _p) throws RecognitionException {
+	private TokQualContext tokQual(int _p) throws RecognitionException {
 		ParserRuleContext _parentctx = _ctx;
 		int _parentState = getState();
-		LvalQualContext _localctx = new LvalQualContext(_ctx, _parentState);
-		LvalQualContext _prevctx = _localctx;
-		int _startState = 10;
-		enterRecursionRule(_localctx, 10, RULE_lvalQual, _p);
+		TokQualContext _localctx = new TokQualContext(_ctx, _parentState);
+		TokQualContext _prevctx = _localctx;
+		int _startState = 14;
+		enterRecursionRule(_localctx, 14, RULE_tokQual, _p);
 		try {
 			int _alt;
 			enterOuterAlt(_localctx, 1);
 			{
 			{
-			setState(85);
-			lvalPart();
+			setState(111);
+			tokQualPart();
 			}
 			_ctx.stop = _input.LT(-1);
-			setState(91);
+			setState(117);
 			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,6,_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();
 					_prevctx = _localctx;
 					{
 					{
-					_localctx = new LvalQualContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_lvalQual);
-					setState(87);
+					_localctx = new TokQualContext(_parentctx, _parentState);
+					pushNewRecursionContext(_localctx, _startState, RULE_tokQual);
+					setState(113);
 					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(88);
-					lvalPart();
+					setState(114);
+					tokQualPart();
 					}
 					} 
 				}
-				setState(93);
+				setState(119);
 				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,6,_ctx);
+				_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
 			}
 			}
 		}
@@ -614,32 +824,32 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class LvalPartContext extends ParserRuleContext {
+	public static class TokQualPartContext extends ParserRuleContext {
 		public TerminalNode ID() { return getToken(NCSynonymDslParser.ID, 0); }
 		public TerminalNode DOT() { return getToken(NCSynonymDslParser.DOT, 0); }
-		public LvalPartContext(ParserRuleContext parent, int invokingState) {
+		public TokQualPartContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_lvalPart; }
+		@Override public int getRuleIndex() { return RULE_tokQualPart; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterLvalPart(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterTokQualPart(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitLvalPart(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitTokQualPart(this);
 		}
 	}
 
-	public final LvalPartContext lvalPart() throws RecognitionException {
-		LvalPartContext _localctx = new LvalPartContext(_ctx, getState());
-		enterRule(_localctx, 12, RULE_lvalPart);
+	public final TokQualPartContext tokQualPart() throws RecognitionException {
+		TokQualPartContext _localctx = new TokQualPartContext(_ctx, getState());
+		enterRule(_localctx, 16, RULE_tokQualPart);
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(94);
+			setState(120);
 			match(ID);
-			setState(95);
+			setState(121);
 			match(DOT);
 			}
 		}
@@ -654,93 +864,75 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class RvalSingleContext extends ParserRuleContext {
+	public static class TokMetaContext extends ParserRuleContext {
+		public TerminalNode TILDA() { return getToken(NCSynonymDslParser.TILDA, 0); }
+		public TerminalNode ID() { return getToken(NCSynonymDslParser.ID, 0); }
+		public TerminalNode LBR() { return getToken(NCSynonymDslParser.LBR, 0); }
 		public TerminalNode INT() { return getToken(NCSynonymDslParser.INT, 0); }
-		public TerminalNode EXP() { return getToken(NCSynonymDslParser.EXP, 0); }
-		public TerminalNode MINUS() { return getToken(NCSynonymDslParser.MINUS, 0); }
-		public TerminalNode BOOL() { return getToken(NCSynonymDslParser.BOOL, 0); }
+		public TerminalNode RBR() { return getToken(NCSynonymDslParser.RBR, 0); }
 		public QstringContext qstring() {
 			return getRuleContext(QstringContext.class,0);
 		}
-		public RvalSingleContext(ParserRuleContext parent, int invokingState) {
+		public TokMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_rvalSingle; }
+		@Override public int getRuleIndex() { return RULE_tokMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterRvalSingle(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterTokMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRvalSingle(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitTokMeta(this);
 		}
 	}
 
-	public final RvalSingleContext rvalSingle() throws RecognitionException {
-		RvalSingleContext _localctx = new RvalSingleContext(_ctx, getState());
-		enterRule(_localctx, 14, RULE_rvalSingle);
-		int _la;
+	public final TokMetaContext tokMeta() throws RecognitionException {
+		TokMetaContext _localctx = new TokMetaContext(_ctx, getState());
+		enterRule(_localctx, 18, RULE_tokMeta);
 		try {
-			setState(108);
+			setState(136);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__8:
+			switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(97);
-				match(T__8);
+				setState(123);
+				match(TILDA);
+				setState(124);
+				match(ID);
 				}
 				break;
-			case MINUS:
-			case INT:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(99);
-				_errHandler.sync(this);
-				_la = _input.LA(1);
-				if (_la==MINUS) {
-					{
-					setState(98);
-					match(MINUS);
-					}
-				}
-
-				setState(104);
-				_errHandler.sync(this);
-				switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
-				case 1:
-					{
-					setState(101);
-					match(INT);
-					}
-					break;
-				case 2:
-					{
-					setState(102);
-					match(INT);
-					setState(103);
-					match(EXP);
-					}
-					break;
-				}
+				setState(125);
+				match(TILDA);
+				setState(126);
+				match(ID);
+				setState(127);
+				match(LBR);
+				setState(128);
+				match(INT);
+				setState(129);
+				match(RBR);
 				}
 				break;
-			case BOOL:
+			case 3:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(106);
-				match(BOOL);
-				}
-				break;
-			case SQUOTE:
-				enterOuterAlt(_localctx, 4);
-				{
-				setState(107);
+				setState(130);
+				match(TILDA);
+				setState(131);
+				match(ID);
+				setState(132);
+				match(LBR);
+				setState(133);
 				qstring();
+				setState(134);
+				match(RBR);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
 			}
 		}
 		catch (RecognitionException re) {
@@ -754,139 +946,75 @@ public class NCSynonymDslParser extends Parser {
 		return _localctx;
 	}
 
-	public static class RvalContext extends ParserRuleContext {
-		public RvalSingleContext rvalSingle() {
-			return getRuleContext(RvalSingleContext.class,0);
-		}
-		public TerminalNode LPAREN() { return getToken(NCSynonymDslParser.LPAREN, 0); }
-		public RvalListContext rvalList() {
-			return getRuleContext(RvalListContext.class,0);
+	public static class ModelMetaContext extends ParserRuleContext {
+		public TerminalNode POUND() { return getToken(NCSynonymDslParser.POUND, 0); }
+		public TerminalNode ID() { return getToken(NCSynonymDslParser.ID, 0); }
+		public TerminalNode LBR() { return getToken(NCSynonymDslParser.LBR, 0); }
+		public TerminalNode INT() { return getToken(NCSynonymDslParser.INT, 0); }
+		public TerminalNode RBR() { return getToken(NCSynonymDslParser.RBR, 0); }
+		public QstringContext qstring() {
+			return getRuleContext(QstringContext.class,0);
 		}
-		public TerminalNode RPAREN() { return getToken(NCSynonymDslParser.RPAREN, 0); }
-		public RvalContext(ParserRuleContext parent, int invokingState) {
+		public ModelMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_rval; }
+		@Override public int getRuleIndex() { return RULE_modelMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterRval(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterModelMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRval(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitModelMeta(this);
 		}
 	}
 
-	public final RvalContext rval() throws RecognitionException {
-		RvalContext _localctx = new RvalContext(_ctx, getState());
-		enterRule(_localctx, 16, RULE_rval);
+	public final ModelMetaContext modelMeta() throws RecognitionException {
+		ModelMetaContext _localctx = new ModelMetaContext(_ctx, getState());
+		enterRule(_localctx, 20, RULE_modelMeta);
 		try {
-			setState(115);
+			setState(151);
 			_errHandler.sync(this);
-			switch (_input.LA(1)) {
-			case T__8:
-			case SQUOTE:
-			case MINUS:
-			case BOOL:
-			case INT:
+			switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(110);
-				rvalSingle();
+				setState(138);
+				match(POUND);
+				setState(139);
+				match(ID);
 				}
 				break;
-			case LPAREN:
+			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(111);
-				match(LPAREN);
-				setState(112);
-				rvalList(0);
-				setState(113);
-				match(RPAREN);
+				setState(140);
+				match(POUND);
+				setState(141);
+				match(ID);
+				setState(142);
+				match(LBR);
+				setState(143);
+				match(INT);
+				setState(144);
+				match(RBR);
 				}
 				break;
-			default:
-				throw new NoViableAltException(this);
-			}
-		}
-		catch (RecognitionException re) {
-			_localctx.exception = re;
-			_errHandler.reportError(this, re);
-			_errHandler.recover(this, re);
-		}
-		finally {
-			exitRule();
-		}
-		return _localctx;
-	}
-
-	public static class RvalListContext extends ParserRuleContext {
-		public RvalSingleContext rvalSingle() {
-			return getRuleContext(RvalSingleContext.class,0);
-		}
-		public RvalListContext rvalList() {
-			return getRuleContext(RvalListContext.class,0);
-		}
-		public TerminalNode COMMA() { return getToken(NCSynonymDslParser.COMMA, 0); }
-		public RvalListContext(ParserRuleContext parent, int invokingState) {
-			super(parent, invokingState);
-		}
-		@Override public int getRuleIndex() { return RULE_rvalList; }
-		@Override
-		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterRvalList(this);
-		}
-		@Override
-		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitRvalList(this);
-		}
-	}
-
-	public final RvalListContext rvalList() throws RecognitionException {
-		return rvalList(0);
-	}
-
-	private RvalListContext rvalList(int _p) throws RecognitionException {
-		ParserRuleContext _parentctx = _ctx;
-		int _parentState = getState();
-		RvalListContext _localctx = new RvalListContext(_ctx, _parentState);
-		RvalListContext _prevctx = _localctx;
-		int _startState = 18;
-		enterRecursionRule(_localctx, 18, RULE_rvalList, _p);
-		try {
-			int _alt;
-			enterOuterAlt(_localctx, 1);
-			{
-			{
-			setState(118);
-			rvalSingle();
-			}
-			_ctx.stop = _input.LT(-1);
-			setState(125);
-			_errHandler.sync(this);
-			_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();
-					_prevctx = _localctx;
-					{
-					{
-					_localctx = new RvalListContext(_parentctx, _parentState);
-					pushNewRecursionContext(_localctx, _startState, RULE_rvalList);
-					setState(120);
-					if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
-					setState(121);
-					match(COMMA);
-					setState(122);
-					rvalSingle();
-					}
-					} 
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(145);
+				match(POUND);
+				setState(146);
+				match(ID);
+				setState(147);
+				match(LBR);
+				setState(148);
+				qstring();
+				setState(149);
+				match(RBR);
 				}
-				setState(127);
-				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
-			}
+				break;
 			}
 		}
 		catch (RecognitionException re) {
@@ -895,13 +1023,13 @@ public class NCSynonymDslParser extends Parser {
 			_errHandler.recover(this, re);
 		}
 		finally {
-			unrollRecursionContexts(_parentctx);
+			exitRule();
 		}
 		return _localctx;
 	}
 
-	public static class MetaContext extends ParserRuleContext {
-		public TerminalNode TILDA() { return getToken(NCSynonymDslParser.TILDA, 0); }
+	public static class IntentMetaContext extends ParserRuleContext {
+		public TerminalNode DOLLAR() { return getToken(NCSynonymDslParser.DOLLAR, 0); }
 		public TerminalNode ID() { return getToken(NCSynonymDslParser.ID, 0); }
 		public TerminalNode LBR() { return getToken(NCSynonymDslParser.LBR, 0); }
 		public TerminalNode INT() { return getToken(NCSynonymDslParser.INT, 0); }
@@ -909,63 +1037,63 @@ public class NCSynonymDslParser extends Parser {
 		public QstringContext qstring() {
 			return getRuleContext(QstringContext.class,0);
 		}
-		public MetaContext(ParserRuleContext parent, int invokingState) {
+		public IntentMetaContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
-		@Override public int getRuleIndex() { return RULE_meta; }
+		@Override public int getRuleIndex() { return RULE_intentMeta; }
 		@Override
 		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterMeta(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).enterIntentMeta(this);
 		}
 		@Override
 		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitMeta(this);
+			if ( listener instanceof NCSynonymDslListener ) ((NCSynonymDslListener)listener).exitIntentMeta(this);
 		}
 	}
 
-	public final MetaContext meta() throws RecognitionException {
-		MetaContext _localctx = new MetaContext(_ctx, getState());
-		enterRule(_localctx, 20, RULE_meta);
+	public final IntentMetaContext intentMeta() throws RecognitionException {
+		IntentMetaContext _localctx = new IntentMetaContext(_ctx, getState());
+		enterRule(_localctx, 22, RULE_intentMeta);
 		try {
-			setState(141);
+			setState(166);
 			_errHandler.sync(this);
-			switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) {
+			switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) {
 			case 1:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(128);
-				match(TILDA);
-				setState(129);
+				setState(153);
+				match(DOLLAR);
+				setState(154);
 				match(ID);
 				}
 				break;
 			case 2:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(130);
-				match(TILDA);
-				setState(131);
+				setState(155);
+				match(DOLLAR);
+				setState(156);
 				match(ID);
-				setState(132);
+				setState(157);
 				match(LBR);
-				setState(133);
+				setState(158);
 				match(INT);
-				setState(134);
+				setState(159);
 				match(RBR);
 				}
 				break;
 			case 3:
 				enterOuterAlt(_localctx, 3);
 				{
-				setState(135);
-				match(TILDA);
-				setState(136);
+				setState(160);
+				match(DOLLAR);
+				setState(161);
 				match(ID);
-				setState(137);
+				setState(162);
 				match(LBR);
-				setState(138);
+				setState(163);
 				qstring();
-				setState(139);
+				setState(164);
 				match(RBR);
 				}
 				break;
@@ -983,10 +1111,8 @@ public class NCSynonymDslParser extends Parser {
 	}
 
 	public static class QstringContext extends ParserRuleContext {
-		public List<TerminalNode> SQUOTE() { return getTokens(NCSynonymDslParser.SQUOTE); }
-		public TerminalNode SQUOTE(int i) {
-			return getToken(NCSynonymDslParser.SQUOTE, i);
-		}
+		public TerminalNode SQSTRING() { return getToken(NCSynonymDslParser.SQSTRING, 0); }
+		public TerminalNode DQSTRING() { return getToken(NCSynonymDslParser.DQSTRING, 0); }
 		public QstringContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1003,37 +1129,21 @@ public class NCSynonymDslParser extends Parser {
 
 	public final QstringContext qstring() throws RecognitionException {
 		QstringContext _localctx = new QstringContext(_ctx, getState());
-		enterRule(_localctx, 22, RULE_qstring);
+		enterRule(_localctx, 24, RULE_qstring);
 		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(143);
-			match(SQUOTE);
-			setState(147);
-			_errHandler.sync(this);
+			setState(168);
 			_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 << PRED_OP) | (1L << AND) | (1L << OR) | (1L << EXCL) | (1L << LPAREN) | (1L << RPAREN) | (1L << TILDA) | (1L << LBR) | (1L << RBR) | (1L << COMMA) | (1L << COLON) | (1L << MINUS) | (1L << DOT) | (1L << UNDERSCORE) | (1L << BOOL) | (1L << INT) | (1L << EXP) | (1L << ID) | (1L << WS) | (1L << ErrorChar [...]
-				{
-				{
-				setState(144);
-				_la = _input.LA(1);
-				if ( _la <= 0 || (_la==SQUOTE) ) {
-				_errHandler.recoverInline(this);
-				}
-				else {
-					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
-					_errHandler.reportMatch(this);
-					consume();
-				}
-				}
-				}
-				setState(149);
-				_errHandler.sync(this);
-				_la = _input.LA(1);
+			if ( !(_la==SQSTRING || _la==DQSTRING) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
 			}
-			setState(150);
-			match(SQUOTE);
 			}
 		}
 		catch (RecognitionException re) {
@@ -1052,9 +1162,9 @@ public class NCSynonymDslParser extends Parser {
 		case 2:
 			return item_sempred((ItemContext)_localctx, predIndex);
 		case 5:
-			return lvalQual_sempred((LvalQualContext)_localctx, predIndex);
-		case 9:
-			return rvalList_sempred((RvalListContext)_localctx, predIndex);
+			return val_sempred((ValContext)_localctx, predIndex);
+		case 7:
+			return tokQual_sempred((TokQualContext)_localctx, predIndex);
 		}
 		return true;
 	}
@@ -1065,14 +1175,14 @@ public class NCSynonymDslParser extends Parser {
 		}
 		return true;
 	}
-	private boolean lvalQual_sempred(LvalQualContext _localctx, int predIndex) {
+	private boolean val_sempred(ValContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 1:
 			return precpred(_ctx, 1);
 		}
 		return true;
 	}
-	private boolean rvalList_sempred(RvalListContext _localctx, int predIndex) {
+	private boolean tokQual_sempred(TokQualContext _localctx, int predIndex) {
 		switch (predIndex) {
 		case 2:
 			return precpred(_ctx, 1);
@@ -1081,49 +1191,55 @@ public class NCSynonymDslParser extends Parser {
 	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3 \u009b\4\2\t\2\4"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3%\u00ad\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\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2$\n\2\3\3\3"+
-		"\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\62\n\4\3\4\3\4\3\4\7\4"+
-		"\67\n\4\f\4\16\4:\13\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5"+
-		"G\n\5\3\6\5\6J\n\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\5\6U\n\6\3\7\3"+
-		"\7\3\7\3\7\3\7\7\7\\\n\7\f\7\16\7_\13\7\3\b\3\b\3\b\3\t\3\t\5\tf\n\t\3"+
-		"\t\3\t\3\t\5\tk\n\t\3\t\3\t\5\to\n\t\3\n\3\n\3\n\3\n\3\n\5\nv\n\n\3\13"+
-		"\3\13\3\13\3\13\3\13\3\13\7\13~\n\13\f\13\16\13\u0081\13\13\3\f\3\f\3"+
-		"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u0090\n\f\3\r\3\r\7\r\u0094"+
-		"\n\r\f\r\16\r\u0097\13\r\3\r\3\r\3\r\2\5\6\f\24\16\2\4\6\b\n\f\16\20\22"+
-		"\24\26\30\2\4\3\2\r\16\3\2\22\22\2\u00a7\2#\3\2\2\2\4%\3\2\2\2\6\61\3"+
-		"\2\2\2\bF\3\2\2\2\nI\3\2\2\2\fV\3\2\2\2\16`\3\2\2\2\20n\3\2\2\2\22u\3"+
-		"\2\2\2\24w\3\2\2\2\26\u008f\3\2\2\2\30\u0091\3\2\2\2\32\33\5\4\3\2\33"+
-		"\34\7\20\2\2\34\35\5\6\4\2\35\36\7\21\2\2\36\37\7\2\2\3\37$\3\2\2\2 !"+
-		"\5\6\4\2!\"\7\2\2\3\"$\3\2\2\2#\32\3\2\2\2# \3\2\2\2$\3\3\2\2\2%&\7\24"+
-		"\2\2&\'\7\36\2\2\'(\7\25\2\2(\5\3\2\2\2)*\b\4\1\2*\62\5\b\5\2+,\7\20\2"+
-		"\2,-\5\6\4\2-.\7\21\2\2.\62\3\2\2\2/\60\7\17\2\2\60\62\5\6\4\3\61)\3\2"+
-		"\2\2\61+\3\2\2\2\61/\3\2\2\2\628\3\2\2\2\63\64\f\4\2\2\64\65\t\2\2\2\65"+
-		"\67\5\6\4\5\66\63\3\2\2\2\67:\3\2\2\28\66\3\2\2\289\3\2\2\29\7\3\2\2\2"+
-		":8\3\2\2\2;<\5\n\6\2<=\7\f\2\2=>\5\22\n\2>G\3\2\2\2?@\7\36\2\2@A\7\20"+
-		"\2\2AB\5\n\6\2BC\7\21\2\2CD\7\f\2\2DE\5\22\n\2EG\3\2\2\2F;\3\2\2\2F?\3"+
-		"\2\2\2G\t\3\2\2\2HJ\5\f\7\2IH\3\2\2\2IJ\3\2\2\2JT\3\2\2\2KU\7\3\2\2LU"+
-		"\7\4\2\2MU\7\5\2\2NU\7\6\2\2OU\7\7\2\2PU\7\b\2\2QU\7\t\2\2RU\7\n\2\2S"+
-		"U\5\26\f\2TK\3\2\2\2TL\3\2\2\2TM\3\2\2\2TN\3\2\2\2TO\3\2\2\2TP\3\2\2\2"+
-		"TQ\3\2\2\2TR\3\2\2\2TS\3\2\2\2U\13\3\2\2\2VW\b\7\1\2WX\5\16\b\2X]\3\2"+
-		"\2\2YZ\f\3\2\2Z\\\5\16\b\2[Y\3\2\2\2\\_\3\2\2\2][\3\2\2\2]^\3\2\2\2^\r"+
-		"\3\2\2\2_]\3\2\2\2`a\7\36\2\2ab\7\31\2\2b\17\3\2\2\2co\7\13\2\2df\7\30"+
-		"\2\2ed\3\2\2\2ef\3\2\2\2fj\3\2\2\2gk\7\34\2\2hi\7\34\2\2ik\7\35\2\2jg"+
-		"\3\2\2\2jh\3\2\2\2ko\3\2\2\2lo\7\33\2\2mo\5\30\r\2nc\3\2\2\2ne\3\2\2\2"+
-		"nl\3\2\2\2nm\3\2\2\2o\21\3\2\2\2pv\5\20\t\2qr\7\20\2\2rs\5\24\13\2st\7"+
-		"\21\2\2tv\3\2\2\2up\3\2\2\2uq\3\2\2\2v\23\3\2\2\2wx\b\13\1\2xy\5\20\t"+
-		"\2y\177\3\2\2\2z{\f\3\2\2{|\7\26\2\2|~\5\20\t\2}z\3\2\2\2~\u0081\3\2\2"+
-		"\2\177}\3\2\2\2\177\u0080\3\2\2\2\u0080\25\3\2\2\2\u0081\177\3\2\2\2\u0082"+
-		"\u0083\7\23\2\2\u0083\u0090\7\36\2\2\u0084\u0085\7\23\2\2\u0085\u0086"+
-		"\7\36\2\2\u0086\u0087\7\24\2\2\u0087\u0088\7\34\2\2\u0088\u0090\7\25\2"+
-		"\2\u0089\u008a\7\23\2\2\u008a\u008b\7\36\2\2\u008b\u008c\7\24\2\2\u008c"+
-		"\u008d\5\30\r\2\u008d\u008e\7\25\2\2\u008e\u0090\3\2\2\2\u008f\u0082\3"+
-		"\2\2\2\u008f\u0084\3\2\2\2\u008f\u0089\3\2\2\2\u0090\27\3\2\2\2\u0091"+
-		"\u0095\7\22\2\2\u0092\u0094\n\3\2\2\u0093\u0092\3\2\2\2\u0094\u0097\3"+
-		"\2\2\2\u0095\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0098\3\2\2\2\u0097"+
-		"\u0095\3\2\2\2\u0098\u0099\7\22\2\2\u0099\31\3\2\2\2\20#\618FIT]ejnu\177"+
-		"\u008f\u0095";
+		"\13\4\f\t\f\4\r\t\r\4\16\t\16\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\5\2"+
+		"&\n\2\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\5\4\64\n\4\3\4\3"+
+		"\4\3\4\7\49\n\4\f\4\16\4<\13\4\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6"+
+		"\5\6H\n\6\3\7\3\7\3\7\3\7\3\7\3\7\5\7P\n\7\3\7\3\7\3\7\7\7U\n\7\f\7\16"+
+		"\7X\13\7\3\b\3\b\5\b\\\n\b\3\b\3\b\3\b\5\ba\n\b\3\b\3\b\3\b\5\bf\n\b\3"+
+		"\b\3\b\5\bj\n\b\3\b\3\b\3\b\5\bo\n\b\3\t\3\t\3\t\3\t\3\t\7\tv\n\t\f\t"+
+		"\16\ty\13\t\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
+		"\13\3\13\3\13\3\13\5\13\u008b\n\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
+		"\3\f\3\f\3\f\3\f\5\f\u009a\n\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+
+		"\3\r\3\r\3\r\5\r\u00a9\n\r\3\16\3\16\3\16\2\5\6\f\20\17\2\4\6\b\n\f\16"+
+		"\20\22\24\26\30\32\2\5\3\2\17\20\3\2\4\13\3\2\f\r\2\u00b8\2%\3\2\2\2\4"+
+		"\'\3\2\2\2\6\63\3\2\2\2\b=\3\2\2\2\nG\3\2\2\2\fO\3\2\2\2\16n\3\2\2\2\20"+
+		"p\3\2\2\2\22z\3\2\2\2\24\u008a\3\2\2\2\26\u0099\3\2\2\2\30\u00a8\3\2\2"+
+		"\2\32\u00aa\3\2\2\2\34\35\5\4\3\2\35\36\7\22\2\2\36\37\5\6\4\2\37 \7\23"+
+		"\2\2 !\7\2\2\3!&\3\2\2\2\"#\5\6\4\2#$\7\2\2\3$&\3\2\2\2%\34\3\2\2\2%\""+
+		"\3\2\2\2&\3\3\2\2\2\'(\7\30\2\2()\7#\2\2)*\7\31\2\2*\5\3\2\2\2+,\b\4\1"+
+		"\2,\64\5\b\5\2-.\7\22\2\2./\5\6\4\2/\60\7\23\2\2\60\64\3\2\2\2\61\62\7"+
+		"\21\2\2\62\64\5\6\4\3\63+\3\2\2\2\63-\3\2\2\2\63\61\3\2\2\2\64:\3\2\2"+
+		"\2\65\66\f\4\2\2\66\67\t\2\2\2\679\5\6\4\58\65\3\2\2\29<\3\2\2\2:8\3\2"+
+		"\2\2:;\3\2\2\2;\7\3\2\2\2<:\3\2\2\2=>\5\n\6\2>?\7\16\2\2?@\5\n\6\2@\t"+
+		"\3\2\2\2AH\5\f\7\2BC\7#\2\2CD\7\22\2\2DE\5\n\6\2EF\7\23\2\2FH\3\2\2\2"+
+		"GA\3\2\2\2GB\3\2\2\2H\13\3\2\2\2IJ\b\7\1\2JP\5\16\b\2KL\7\22\2\2LM\5\f"+
+		"\7\2MN\7\23\2\2NP\3\2\2\2OI\3\2\2\2OK\3\2\2\2PV\3\2\2\2QR\f\3\2\2RS\7"+
+		"\32\2\2SU\5\f\7\4TQ\3\2\2\2UX\3\2\2\2VT\3\2\2\2VW\3\2\2\2W\r\3\2\2\2X"+
+		"V\3\2\2\2Yo\7\3\2\2Z\\\7\35\2\2[Z\3\2\2\2[\\\3\2\2\2\\`\3\2\2\2]a\7!\2"+
+		"\2^_\7!\2\2_a\7\"\2\2`]\3\2\2\2`^\3\2\2\2ao\3\2\2\2bo\7 \2\2co\5\32\16"+
+		"\2df\5\20\t\2ed\3\2\2\2ef\3\2\2\2fg\3\2\2\2go\t\3\2\2hj\5\20\t\2ih\3\2"+
+		"\2\2ij\3\2\2\2jk\3\2\2\2ko\5\24\13\2lo\5\26\f\2mo\5\30\r\2nY\3\2\2\2n"+
+		"[\3\2\2\2nb\3\2\2\2nc\3\2\2\2ne\3\2\2\2ni\3\2\2\2nl\3\2\2\2nm\3\2\2\2"+
+		"o\17\3\2\2\2pq\b\t\1\2qr\5\22\n\2rw\3\2\2\2st\f\3\2\2tv\5\22\n\2us\3\2"+
+		"\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2\2\2x\21\3\2\2\2yw\3\2\2\2z{\7#\2\2{|\7"+
+		"\36\2\2|\23\3\2\2\2}~\7\27\2\2~\u008b\7#\2\2\177\u0080\7\27\2\2\u0080"+
+		"\u0081\7#\2\2\u0081\u0082\7\30\2\2\u0082\u0083\7!\2\2\u0083\u008b\7\31"+
+		"\2\2\u0084\u0085\7\27\2\2\u0085\u0086\7#\2\2\u0086\u0087\7\30\2\2\u0087"+
+		"\u0088\5\32\16\2\u0088\u0089\7\31\2\2\u0089\u008b\3\2\2\2\u008a}\3\2\2"+
+		"\2\u008a\177\3\2\2\2\u008a\u0084\3\2\2\2\u008b\25\3\2\2\2\u008c\u008d"+
+		"\7\34\2\2\u008d\u009a\7#\2\2\u008e\u008f\7\34\2\2\u008f\u0090\7#\2\2\u0090"+
+		"\u0091\7\30\2\2\u0091\u0092\7!\2\2\u0092\u009a\7\31\2\2\u0093\u0094\7"+
+		"\34\2\2\u0094\u0095\7#\2\2\u0095\u0096\7\30\2\2\u0096\u0097\5\32\16\2"+
+		"\u0097\u0098\7\31\2\2\u0098\u009a\3\2\2\2\u0099\u008c\3\2\2\2\u0099\u008e"+
+		"\3\2\2\2\u0099\u0093\3\2\2\2\u009a\27\3\2\2\2\u009b\u009c\7\26\2\2\u009c"+
+		"\u00a9\7#\2\2\u009d\u009e\7\26\2\2\u009e\u009f\7#\2\2\u009f\u00a0\7\30"+
+		"\2\2\u00a0\u00a1\7!\2\2\u00a1\u00a9\7\31\2\2\u00a2\u00a3\7\26\2\2\u00a3"+
+		"\u00a4\7#\2\2\u00a4\u00a5\7\30\2\2\u00a5\u00a6\5\32\16\2\u00a6\u00a7\7"+
+		"\31\2\2\u00a7\u00a9\3\2\2\2\u00a8\u009b\3\2\2\2\u00a8\u009d\3\2\2\2\u00a8"+
+		"\u00a2\3\2\2\2\u00a9\31\3\2\2\2\u00aa\u00ab\t\4\2\2\u00ab\33\3\2\2\2\21"+
+		"%\63:GOV[`einw\u008a\u0099\u00a8";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {