using Canon.Core.Abstractions;
using Canon.Core.Enums;
using Canon.Core.LexicalParser;
namespace Canon.Core.SyntaxNodes;
public class ProcedureGeneratorEventArgs : EventArgs;
public class FunctionGeneratorEventArgs : EventArgs
{
public required BasicType ReturnType { get; init; }
}
public class SubprogramHead : NonTerminatedSyntaxNode
{
public override NonTerminatorType Type => NonTerminatorType.SubprogramHead;
///
/// 过程定义还是函数定义
///
public bool IsProcedure { get; private init; }
///
/// 子程序的名称
///
public IdentifierSemanticToken SubprogramName =>
Children[1].Convert().Token.Convert();
public FormalParameter Parameters => Children[2].Convert();
public override void PreVisit(SyntaxNodeVisitor visitor)
{
visitor.PreVisit(this);
RaiseEvent();
}
public override void PostVisit(SyntaxNodeVisitor visitor)
{
visitor.PostVisit(this);
RaiseEvent();
}
public event EventHandler? OnProcedureGenerator;
public event EventHandler? OnFunctionGenerator;
public static SubprogramHead Create(List children)
{
bool isProcedure;
TerminatedSyntaxNode node = children[0].Convert();
KeywordSemanticToken token = (KeywordSemanticToken)node.Token;
if (token.KeywordType == KeywordType.Procedure)
{
isProcedure = true;
}
else if (token.KeywordType == KeywordType.Function)
{
isProcedure = false;
}
else
{
throw new InvalidOperationException();
}
return new SubprogramHead { Children = children, IsProcedure = isProcedure };
}
private void RaiseEvent()
{
if (IsProcedure)
{
OnProcedureGenerator?.Invoke(this, new ProcedureGeneratorEventArgs());
}
else
{
OnFunctionGenerator?.Invoke(this,
new FunctionGeneratorEventArgs { ReturnType = Children[4].Convert() });
}
OnProcedureGenerator = null;
OnFunctionGenerator = null;
}
}