Пример #1
0
        /// <summary>
        /// Parse a literal node as described in X3J20 "3.4.6 Literals".
        /// </summary>
        /// <remarks>
        /// If the given token is not a legal token for a literal node,
        /// it is simply returned in the residueToken output parameter,
        /// and the function returns null.
        /// </remarks>
        /// <param name="parent">Parent node that defines the literal node.</param>
        /// <param name="token">First token of the literal node.</param>
        /// <returns>A literal node, or null in case of non-literal token.</returns>
        protected virtual LiteralNode ParseLiteral(ILiteralNodeParent parent, Token token)
        {
            // PARSE: <literal> ::= <number literal> | <string literal> | <character literal> |
            //      <symbol literal> | <selector literal> | <array literal>

            // <string literal> ::= quotedString
            if (token is StringToken)   // 'example'
            {
                return(new StringLiteralNode(parent, (StringToken)token));
            }
            // <symbol literal> ::= hashedString
            if (token is HashedStringToken) // #'example'
            {
                return(new SymbolLiteralNode(parent, (HashedStringToken)token));
            }
            // <character literal> ::= quotedCharacter
            if (token is CharacterToken)    // $e
            {
                return(new CharacterLiteralNode(parent, (CharacterToken)token));
            }
            // <selector literal> ::= quotedSelector
            if (token is QuotedSelectorToken)   // #example ..or.. #example: ..or.. #example:example: ..or.. #+
            {
                return(new SelectorLiteralNode(parent, (QuotedSelectorToken)token));
            }

            // <number literal> ::= ['-'] <number>
            if (token is NegativeSignToken)
            {
                return(this.ParseNegativeNumericLiteralNode(parent, (NegativeSignToken)token));
            }
            // <number> ::= integer | float | scaledDecimal
            if (token is SmallIntegerToken)
            {
                return(new SmallIntegerLiteralNode(parent, (SmallIntegerToken)token, null));
            }
            if (token is LargeIntegerToken)
            {
                return(new LargeIntegerLiteralNode(parent, (LargeIntegerToken)token, null));
            }
            if (token is FloatEToken)
            {
                return(new FloatELiteralNode(parent, (FloatEToken)token, null));
            }
            if (token is FloatDToken)
            {
                return(new FloatDLiteralNode(parent, (FloatDToken)token, null));
            }
            if (token is ScaledDecimalToken)
            {
                return(new ScaledDecimalLiteralNode(parent, (ScaledDecimalToken)token, null));
            }

            // <array literal> ::= '#(' <array element>* ')'
            // <array element> ::= <literal> | identifier
            if (Parser.IsLiteralArrayPrefix(token))
            {
                return(this.ParseArrayLiteral(parent, (SpecialCharacterToken)token));
            }

            this.ResidueToken = token;
            return(null);
        }