/// <summary>
        /// Special visitor to extract composite entities.
        /// This class is static.
        /// </summary>
        /// <param name="context">The intent context.</param>
        /// <returns>The utterance to entities map.</returns>
        public static UtteranceAndEntitiesMap VisitNormalIntentStringContext(LUFileParser.NormalIntentStringContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var utterance     = string.Empty;
            var entities      = new List <EntityElement>();
            var errorMessages = new List <string>();

            // TODO: Check that this interface is actually implemented in the iterable
            foreach (ITerminalNode innerNode in context.children)
            {
                switch (innerNode.Symbol.Type)
                {
                case LUFileParser.DASH:
                    break;

                case LUFileParser.EXPRESSION:
                    var tokenizedUterance = TokenizeUtterance(innerNode.GetText().Trim());
                    var utteranceBuilder  = new StringBuilder(utterance.TrimStart());
                    utterance = RecursivelyResolveTokenizedUtterance(tokenizedUterance, entities, errorMessages, utteranceBuilder).ToString();
                    break;

                default:
                    utterance += innerNode.GetText();
                    break;
                }
            }

            return(new UtteranceAndEntitiesMap
            {
                Utterance = utterance.Trim(),
                Entities = entities,
                ErrorMsgs = errorMessages
            });
        }
 /// <summary>
 /// Visit a parse tree produced by <see cref="LUFileParser.normalIntentString"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitNormalIntentString([NotNull] LUFileParser.NormalIntentStringContext context)
 {
     return(VisitChildren(context));
 }
 /// <summary>
 /// Exit a parse tree produced by <see cref="LUFileParser.normalIntentString"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitNormalIntentString([NotNull] LUFileParser.NormalIntentStringContext context)
 {
 }