Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
0
        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);
        }