used unique_ptr instead of shared since the context inside the parser cannot have more than an owner