using Canon.Core.Abstractions; using Canon.Core.Enums; using Canon.Core.SemanticParser; namespace Canon.Core.SyntaxNodes; public class IndexGeneratorEventArgs : EventArgs { public required ExpressionList IndexParameters { get; init; } } public class IdentifierVarPart : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.IdVarPart; /// /// 数组索引的个数 /// public int IndexCount { get; set; } /// /// 数组左边界列表 /// public List LeftBounds = new(); public override void PreVisit(SyntaxNodeVisitor visitor) { visitor.PreVisit(this); RaiseEvent(); } public override void PostVisit(SyntaxNodeVisitor visitor) { visitor.PostVisit(this); RaiseEvent(); } /// /// 使用了索引产生式的事件 /// public event EventHandler? OnIndexGenerator; public static IdentifierVarPart Create(List children) { return new IdentifierVarPart { Children = children }; } private void RaiseEvent() { if (Children.Count == 3) { OnIndexGenerator?.Invoke(this, new IndexGeneratorEventArgs() { IndexParameters = Children[1].Convert() }); } OnIndexGenerator = null; } }