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 List Expressions { get; } = []; 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) { IdentifierVarPart result = new() { Children = children }; if (children.Count == 3) { ExpressionList expressionList = children[1].Convert(); result.Expressions.AddRange(expressionList.Expressions); } return result; } private void RaiseEvent() { if (Children.Count == 3) { OnIndexGenerator?.Invoke(this, new IndexGeneratorEventArgs() { IndexParameters = Children[1].Convert() }); } OnIndexGenerator = null; } }