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); }