Esempio n. 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);
        }