diff --git a/Katheryne/KatheryneChatRobot.cs b/Katheryne/KatheryneChatRobot.cs index c84e5f3..644f8f5 100644 --- a/Katheryne/KatheryneChatRobot.cs +++ b/Katheryne/KatheryneChatRobot.cs @@ -1,8 +1,7 @@ +using System.Text.RegularExpressions; using Katheryne.Abstractions; using Katheryne.Models; -using Katheryne.Services; using Microsoft.Extensions.Logging; -using YamlDotNet.Serialization; namespace Katheryne; @@ -28,7 +27,7 @@ public class KatheryneChatRobot : IChatRobot { return new[] { - _grammarTree[_currentStage] + _grammarTree[_currentStage].Answer }; } @@ -42,13 +41,51 @@ public class KatheryneChatRobot : IChatRobot public IEnumerable ChatNext(string input) { - _logger.LogDebug("Receive input {} on stage {}.", input, _currentStage); - (_currentStage, string answer) = _grammarTree.NextStage(_currentStage, input); - _logger.LogDebug("Change stage to {}.", _currentStage); + List result = new(); - return new[] + foreach (InnerTransformer transformer in _grammarTree[_currentStage].Transformers) { - answer - }; + if (transformer.Pattern is null) + { + continue; + } + + Match match = transformer.Pattern.Match(input); + + if (match.Success) + { + _currentStage = transformer.NextStage; + result.Add(_grammarTree[_currentStage].Answer); + _logger.LogDebug("Moving to stage {}.", _currentStage); + } + } + + EmptyTransform(result); + return result; + } + + /// + /// 进行当前阶段的空转移 + /// + /// 存放输出回答的列表 + private void EmptyTransform(List result) + { + var flag = true; + while (flag) + { + flag = false; + foreach (InnerTransformer transformer in _grammarTree[_currentStage].Transformers) + { + if (string.IsNullOrEmpty(transformer.RowPattern)) + { + flag = true; + _currentStage = transformer.NextStage; + result.Add(_grammarTree[_currentStage].Answer); + + _logger.LogDebug("Moving to stage {} with empty transform.", _currentStage); + break; + } + } + } } } \ No newline at end of file diff --git a/Katheryne/Models/GrammarTree.cs b/Katheryne/Models/GrammarTree.cs index c76d694..2c4effa 100644 --- a/Katheryne/Models/GrammarTree.cs +++ b/Katheryne/Models/GrammarTree.cs @@ -1,4 +1,3 @@ -using System.Text.RegularExpressions; using Katheryne.Exceptions; namespace Katheryne.Models; @@ -19,33 +18,9 @@ public class GrammarTree throw new GrammarException("使用了未声明的阶段名"); } } + - /// - /// 获得下一个阶段 - /// - /// 当前所在阶段 - /// 用户输入 - /// 元组,第一个参数是下一个阶段名称 第二个参数是机器人回答 - /// - public (string, string) NextStage(string currentStage, string input) - { - List transformers = _stages[currentStage].Transformers; - - foreach (InnerTransformer transformer in transformers) - { - Match match = transformer.Pattern.Match(input); - - if (match.Success) - { - return (_stages[transformer.NextStage].Name, - _stages[transformer.NextStage].Answer); - } - } - - throw new GrammarException("Failed to get next stage."); - } - - public string this[string index] => _stages[index].Answer; + internal InnerStage this[string index] => _stages[index]; /// /// 主要验证语法的两个特点 @@ -65,45 +40,4 @@ public class GrammarTree return stage.Transformers.All(t => _stages.ContainsKey(t.NextStageName)); }); } - - private class InnerStage - { - public string Name { get; } - - public List Transformers { get; } = new(); - - public string Answer { get; } - - public InnerStage(Stage stage) - { - Name = stage.Name; - Answer = stage.Answer; - - foreach (Transformer transformer in stage.Transformers) - { - Transformers.Add(new InnerTransformer(transformer)); - } - } - } - - private class InnerTransformer - { - public Regex Pattern { get; } - - public string NextStage { get; } - - public InnerTransformer(Transformer transformer) - { - NextStage = transformer.NextStageName; - - try - { - Pattern = new Regex(transformer.Pattern); - } - catch (ArgumentException e) - { - throw new GrammarException($"Failed to Parse regex:{transformer.Pattern}.", e); - } - } - } } \ No newline at end of file diff --git a/Katheryne/Models/InnerStage.cs b/Katheryne/Models/InnerStage.cs new file mode 100644 index 0000000..29aec60 --- /dev/null +++ b/Katheryne/Models/InnerStage.cs @@ -0,0 +1,21 @@ +namespace Katheryne.Models; + +internal class InnerStage +{ + public string Name { get; } + + public List Transformers { get; } = new(); + + public string Answer { get; } + + public InnerStage(Stage stage) + { + Name = stage.Name; + Answer = stage.Answer; + + foreach (Transformer transformer in stage.Transformers) + { + Transformers.Add(new InnerTransformer(transformer)); + } + } +} \ No newline at end of file diff --git a/Katheryne/Models/InnerTransformer.cs b/Katheryne/Models/InnerTransformer.cs new file mode 100644 index 0000000..b306103 --- /dev/null +++ b/Katheryne/Models/InnerTransformer.cs @@ -0,0 +1,33 @@ +using System.Text.RegularExpressions; +using Katheryne.Exceptions; + +namespace Katheryne.Models; + +internal class InnerTransformer +{ + public Regex? Pattern { get; } + + public string RowPattern { get; } + + public string NextStage { get; } + + public InnerTransformer(Transformer transformer) + { + NextStage = transformer.NextStageName; + RowPattern = transformer.Pattern; + + if (string.IsNullOrEmpty(RowPattern)) + { + return; + } + + try + { + Pattern = new Regex(transformer.Pattern); + } + catch (ArgumentException e) + { + throw new GrammarException($"Failed to Parse regex:{transformer.Pattern}.", e); + } + } +} \ No newline at end of file