private Statement ParseStatement()
        {
            var label = ParseLabel();

            var inner = TryExtractVariants(new Func <AstNode>[] {
                ParseAssemblyBlock,
                ParseExtensionStatement,
            });

            if (label == null && inner == null)
            {
                return(null);
            }
            if (label != null && inner == null)
            {
                var t = NextToken();

                throw SyntaxError.Make(SyntaxErrorMessages.STATEMENT_EXPECTED, t);
            }

            var node = new Statement();

            if (label != null)
            {
                node.AddChild(node);
            }
            node.AddChild(inner);

            return(node);
        }