Пример #1
0
        public ParserNode HandleLevel_Identifier()
        {
            ParserNode ParserNode;

            switch (CurrentTokenType)
            {
                case "OperatorTemplateToken":
                    String Operator = CurrentToken.Text;
                    switch (Operator)
                    {
                        // Unary Operators
                        case "+": case "-":
                            Tokens.MoveNext();
                            ParserNode = new ParserNodeUnaryOperation()
                            {
                                Parent = HandleLevel_Identifier(),
                                Operator = Operator,
                            };
                            Tokens.MoveNext();
                            break;
                        case "(":
                            Tokens.MoveNext();
                            ParserNode = HandleLevel_Expression();
                            Tokens.ExpectValueAndNext(")");
                            break;
                        default:
                            throw (new Exception(String.Format("Invalid operator '{0}'('{1}')", CurrentTokenType, CurrentToken.Text)));
                    }
                    break;
                case "NumericLiteralTemplateToken":
                    ParserNode = new ParserNodeNumericLiteral()
                    {
                        Value = Int64.Parse(CurrentToken.Text),
                    };
                    Tokens.MoveNext();
                    break;
                case "IdentifierTemplateToken":
                    String Id = CurrentToken.Text;
                    Tokens.MoveNext();

                    // Constants.
                    switch (Id) {
                        case "true":
                            ParserNode = new ParserNodeConstant(Id);
                            break;
                        case "false":
                            ParserNode = new ParserNodeConstant(Id);
                            break;
                        case "none":
                            ParserNode = new ParserNodeConstant(Id);
                            break;
                        default:
                            ParserNode = new ParserNodeIdentifier(Id);
                            break;
                    }

                    bool Running = true;
                    while (Running)
                    {
                        switch (CurrentToken.Text)
                        {
                            // Dot identifier accessor.
                            case ".": {
                                Tokens.MoveNext();
                                TemplateToken AcessToken = Tokens.ExpectTypeAndNext(typeof(IdentifierTemplateToken));
                                ParserNode = new ParserNodeAccess(ParserNode, new ParserNodeStringLiteral(AcessToken.Text));
                            } break;
                            // Brace expression accessor.
                            case "[": {
                                Tokens.MoveNext();
                                ParserNode AccessNode = HandleLevel_Expression();
                                Tokens.ExpectValueAndNext("]");
                                ParserNode = new ParserNodeAccess(ParserNode, AccessNode);
                            } break;
                            default:
                                Running = false;
                                break;
                        }
                    }

                    break;
                case "StringLiteralTemplateToken":
                    ParserNode = new ParserNodeStringLiteral(((StringLiteralTemplateToken)CurrentToken).UnescapedText);
                    Tokens.MoveNext();
                    break;
                default:
                    throw (new Exception(String.Format("Invalid Identifier '{0}'('{1}')", CurrentTokenType, CurrentToken.Text)));
            }

            return ParserNode;
        }