using Canon.Core.Abstractions; using Canon.Core.CodeGenerators; using Canon.Core.Enums; using Canon.Core.SemanticParser; namespace Canon.Core.SyntaxNodes; public class OnTermGeneratorEventArgs : EventArgs { public required Term Term { get; init; } } public class OnAddGeneratorEventArgs : 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 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; private PascalType? _simpleExpressionType; public PascalType SimpleExpressionType { get { if (_simpleExpressionType is null) { throw new InvalidOperationException(); } return _simpleExpressionType; } set { _simpleExpressionType = value; } } public static SimpleExpression Create(List children) { return new SimpleExpression { Children = children }; } private void RaiseEvent() { if (Children.Count == 1) { OnTermGenerator?.Invoke(this, new OnTermGeneratorEventArgs { Term = Children[0].Convert() }); } else { OnAddGenerator?.Invoke(this, new OnAddGeneratorEventArgs { Left = Children[0].Convert(), Operator = Children[1].Convert(), Right = Children[2].Convert() }); } OnTermGenerator = null; OnAddGenerator = null; } public override void GenerateCCode(CCodeBuilder builder) { foreach (var child in Children) { child.GenerateCCode(builder); } } }