using Canon.Core.Abstractions; using Canon.Core.Enums; namespace Canon.Core.SyntaxNodes; public class TermGeneratorEventArgs : EventArgs { public required Term Term { get; init; } } public class AddGeneratorEventArgs : EventArgs { public required SimpleExpression Left { get; init; } public required AddOperator Operator { get; init; } public required Term Right { get; init; } } public class SimpleExpression : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.SimpleExpression; /// /// 是否为条件判断语句 /// public bool IsCondition { get; set; } public override void PreVisit(SyntaxNodeVisitor visitor) { visitor.PreVisit(this); RaiseEvent(); } public override void PostVisit(SyntaxNodeVisitor visitor) { visitor.PostVisit(this); RaiseEvent(); } /// /// 直接赋值产生式的事件 /// public event EventHandler? OnTermGenerator; /// /// 加法产生式的事件 /// public event EventHandler? OnAddGenerator; public static SimpleExpression Create(List children) { return new SimpleExpression { Children = children }; } private void RaiseEvent() { if (Children.Count == 1) { OnTermGenerator?.Invoke(this, new TermGeneratorEventArgs { Term = Children[0].Convert() }); } else { OnAddGenerator?.Invoke(this, new AddGeneratorEventArgs { Left = Children[0].Convert(), Operator = Children[1].Convert(), Right = Children[2].Convert() }); } OnTermGenerator = null; OnAddGenerator = null; } }