コード例 #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SimpleIntentSection"/> class.
        /// </summary>
        /// <param name="parseTree">The simple section context from the parse tree.</param>
        public SimpleIntentSection(LUFileParser.SimpleIntentSectionContext parseTree)
        {
            if (parseTree == null)
            {
                throw new ArgumentNullException(nameof(parseTree));
            }

            SectionType             = SectionType.SimpleIntentSection;
            UtteranceAndEntitiesMap = new List <UtteranceAndEntitiesMap>();
            Entities = new List <SectionEntity>();
            Errors   = new List <Error>();
            Body     = string.Empty;

            if (parseTree != null)
            {
                Name           = ExtractName(parseTree);
                IntentNameLine = ExtractIntentNameLine(parseTree);
                var result = ExtractUtterancesAndEntitiesMap(parseTree);
                UtteranceAndEntitiesMap = result.utterances;
                Errors = result.errors;
                string secTypeStr = $"{SectionType}";
                Id = $"{char.ToLower(secTypeStr[0], System.Globalization.CultureInfo.InvariantCulture) + secTypeStr.Substring(1)}_{Name}";
                var startPosition = new Position {
                    Line = parseTree.Start.Line, Character = parseTree.Start.Column
                };
                var stopPosition = new Position {
                    Line = parseTree.Stop.Line, Character = parseTree.Stop.Column + parseTree.Stop.Text.Length
                };
                Range = new Range {
                    Start = startPosition, End = stopPosition
                };
            }
        }
コード例 #2
0
        private (List <UtteranceAndEntitiesMap> utterances, List <Error> errors) ExtractUtterancesAndEntitiesMap(LUFileParser.SimpleIntentSectionContext parseTree)
        {
            var utterancesAndEntitiesMap = new List <UtteranceAndEntitiesMap>();
            var errors = new List <Error>();

            if (parseTree.intentDefinition().intentBody() != null && parseTree.intentDefinition().intentBody().normalIntentBody() != null)
            {
                foreach (var errorIntentStr in parseTree.intentDefinition().intentBody().normalIntentBody().errorString())
                {
                    if (!string.IsNullOrEmpty(errorIntentStr.GetText().Trim()))
                    {
                        errors.Add(
                            Diagnostic.BuildDiagnostic(
                                message: "Invalid intent body line, did you miss '-' at line begin?",
                                context: errorIntentStr));
                    }
                }

                foreach (var normalIntentStr in parseTree.intentDefinition().intentBody().normalIntentBody().normalIntentString())
                {
                    UtteranceAndEntitiesMap utteranceAndEntities = null;

                    try
                    {
                        utteranceAndEntities = Visitor.VisitNormalIntentStringContext(normalIntentStr);
                    }
                    catch
                    {
                        errors.Add(
                            Diagnostic.BuildDiagnostic(
                                message: "Invalid utterance definition found. Did you miss a '{' or '}'?",
                                context: normalIntentStr));
                    }

                    if (utteranceAndEntities != null)
                    {
                        utteranceAndEntities.ContextText = normalIntentStr.GetText();
                        var startPos = new Position {
                            Line = normalIntentStr.Start.Line, Character = normalIntentStr.Start.Column
                        };
                        var stopPos = new Position {
                            Line = normalIntentStr.Stop.Line, Character = normalIntentStr.Stop.Column + normalIntentStr.Stop.Text.Length
                        };
                        utteranceAndEntities.Range = new Range {
                            Start = startPos, End = stopPos
                        };

                        var markdownUrlMatch = Regex.Match(utteranceAndEntities.Utterance, @"^\[(?:[^\[]+)\]\((.*)\)$");

                        if (markdownUrlMatch.Success)
                        {
                            utteranceAndEntities.References = new Reference()
                            {
                                Source = markdownUrlMatch.Groups[1].Value
                            };
                        }

                        utterancesAndEntitiesMap.Add(utteranceAndEntities);
                        foreach (var errorMsg in utteranceAndEntities.ErrorMsgs)
                        {
                            errors.Add(
                                Diagnostic.BuildDiagnostic(
                                    message: errorMsg,
                                    context: normalIntentStr));
                        }
                    }
                }
            }

            if (utterancesAndEntitiesMap.Count == 0)
            {
                var errorMsg = $"no utterances found for intent definition: \"# {this.Name}\"";
                var error    = Diagnostic.BuildDiagnostic(
                    message: errorMsg,
                    context: parseTree.intentDefinition().intentNameLine(),
                    severity: Diagnostic.WARN);

                errors.Add(error);
            }

            return(utterances : utterancesAndEntitiesMap, errors);
        }
コード例 #3
0
 private string ExtractIntentNameLine(LUFileParser.SimpleIntentSectionContext parseTree)
 {
     return(parseTree.intentDefinition().intentNameLine().GetText().Trim());
 }
コード例 #4
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="LUFileParser.simpleIntentSection"/>.
 /// <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 VisitSimpleIntentSection([NotNull] LUFileParser.SimpleIntentSectionContext context)
 {
     return(VisitChildren(context));
 }
コード例 #5
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="LUFileParser.simpleIntentSection"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitSimpleIntentSection([NotNull] LUFileParser.SimpleIntentSectionContext context)
 {
 }