private SyntaxNode ParseAssignmentExpression() { SyntaxNode expr = ParseBinaryExpression(); if (Match(TokenType.Equal)) { Token equals = Previous(); SyntaxNode value = ParseAssignmentExpression(); if (expr is VariableExpression) { Token name = ((VariableExpression)expr).Name; return(new AssignmentExpression(name, value)); } else if (expr is GetExpression) { GetExpression get = (GetExpression)expr; return(new SetExpression(get.Object, get.Name, value)); } Error(equals, "Invalid Assignment Target"); } return(expr); }
private object EvaluateGetExpression(GetExpression expr) { var obj = Evaluate(expr.Object); if (obj is LoxInstance) { return(((LoxInstance)obj).Get(expr.Name)); } throw new RuntimeError(expr.Name, "Only instances have properties"); }
private SyntaxNode ParseCallExpression() { SyntaxNode expr = ParsePrimaryExpression(); while (true) { if (Match(TokenType.LeftParen)) { expr = ParseFinishCall(expr); } else if (Match(TokenType.Dot)) { Consume(TokenType.Identifier, "Expect property name after '.'"); Token name = Previous(); expr = new GetExpression(expr, name); } else { break; } } return(expr); }