namespace CanonSharp.Pascal.SyntaxTree; public enum SyntaxNodeType { BinaryOperator, UnaryOperator, IntegerValue, FloatValue, BooleanValue, CharValue, Variable, Type, Assign, Block, Constant, VariableDeclaration, If, While, For, ProcedureCall, Parameter, SubprogramHead, SubprogramBody, SubProgram, ProgramBody, ProgramHead, Program } public abstract class SyntaxNodeBase { public abstract SyntaxNodeType NodeType { get; } public T Convert() where T : SyntaxNodeBase { if (this is not T result) { throw new InvalidCastException($"Can't convert {NodeType} to target node."); } return result; } }