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);
while (true)
{
if (CurrentToken.Text == ".")
{
Tokens.MoveNext();
TemplateToken AcessToken = Tokens.ExpectTypeAndNext(typeof(IdentifierTemplateToken));
ParserNode = new ParserNodeAccess(ParserNode, new ParserNodeStringLiteral(AcessToken.Text));
}
else if (CurrentToken.Text == "[")
{
Tokens.MoveNext();
ParserNode AccessNode = HandleLevel_Expression();
Tokens.ExpectValueAndNext("]");
ParserNode = new ParserNodeAccess(ParserNode, AccessNode);
}
else
{
break;
}
}
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;
}