//---------------------------------------------------------------------
        public void Visit(RightParanthesis paranthesis)
        {
            this.CheckIntrinsic(paranthesis);

            if (_paranthesisStack.Count == 0 || !(_paranthesisStack.Peek() is LeftParanthesis))
            {
                throw ParsingException.NoLeftParanthesis(paranthesis);
            }

            _paranthesisStack.Pop();

            _lastToken = paranthesis;
        }
        //---------------------------------------------------------------------
        public void Visit(RightParanthesis paranthesis)
        {
            this.EvaluateWhile(() => _operationStack.Count > 0 && !(_operationStack.Peek() is LeftParanthesis));
            _operationStack.Pop();

            if (_intrinsicStack.Count > 0)
            {
                Intrinsic  intrinsic = _intrinsicStack.Pop();
                Expression arg       = _expressionStack.Pop();
                Expression res       = intrinsic.Apply(arg);

                _expressionStack.Push(res);
            }

            _lastToken = paranthesis;
        }
        //---------------------------------------------------------------------
        internal static ParsingException NoLeftParanthesis(RightParanthesis rightParanthesis)
        {
            string msg = $"No left parenthesis that matches the right paranthesis at position {rightParanthesis.Position}.";

            return(new ParsingException(msg));
        }