Ejemplo n.º 1
0
        public object VisitGetExpr(Expr.Get expr)
        {
            object objekt = Evaluate(expr.Objekt);

            if (objekt is BasilInstance)
            {
                return(((BasilInstance)objekt).Get(expr.Name));
            }
            throw new RuntimeError(expr.Name, "Only instances have properties.");
        }
Ejemplo n.º 2
0
        private Expr Call()
        {
            Expr expr = Primary();

            while (true)
            {
                if (Match(Token.TokenType.LeftParenthesis))
                {
                    expr = FinishCall(expr);
                }
                else if (Match(Token.TokenType.Dot))
                {
                    Token name = Consume(Token.TokenType.Identifier, "Expect property name after '.'.");
                    expr = new Expr.Get(expr, name);
                }
                else
                {
                    break;
                }
            }
            return(expr);
        }
Ejemplo n.º 3
0
 public string VisitGetExpr(Expr.Get expr)
 {
     throw new System.NotImplementedException();
 }
Ejemplo n.º 4
0
 public object VisitGetExpr(Expr.Get expr)
 {
     Resolve(expr.Objekt);
     return(null);
 }
Ejemplo n.º 5
0
        private Expr Assignment()
        {
            Expr expr = Or();

            if (Match(Token.TokenType.PlusPlus))
            {
                Token variable = Previous();

                if (expr is Expr.Variable v)
                {
                    Token name = v.name;
                    return(new Expr.Assign(name,
                                           new Expr.Binary(expr, new Token(Token.TokenType.Plus, "+", null, variable.line), new Expr.Literal(1.0))));
                }
                else if (expr is Expr.Get)
                {
                    Expr.Get get = (Expr.Get)expr;
                    return(new Expr.Set(get.Objekt, get.Name, new Expr.Binary(expr, new Token(Token.TokenType.Plus, "+", null, variable.line), new Expr.Literal(1.0))));
                }
                Error(variable, "Invalid assignment target.");
            }

            if (Match(Token.TokenType.MinusMinus))
            {
                Token variable = Previous();

                if (expr is Expr.Variable v)
                {
                    Token name = v.name;
                    return(new Expr.Assign(name,
                                           new Expr.Binary(expr, new Token(Token.TokenType.Plus, "+", null, variable.line), new Expr.Literal(-1.0))));
                }
                else if (expr is Expr.Get)
                {
                    Expr.Get get = (Expr.Get)expr;
                    return(new Expr.Set(get.Objekt, get.Name, new Expr.Binary(expr, new Token(Token.TokenType.Plus, "+", null, variable.line), new Expr.Literal(-1.0))));
                }
                Error(variable, "Invalid assignment target.");
            }

            if (Match(Token.TokenType.Equal, Token.TokenType.MinusEqual, Token.TokenType.PlusEqual,
                      Token.TokenType.StarEqual, Token.TokenType.SlashEqual, Token.TokenType.PercentEqual,
                      Token.TokenType.PlusPlus))
            {
                Token equals        = Previous();
                Expr  tempValue     = Assignment();
                Expr  assignedValue = tempValue;

                switch (equals.type)
                {
                case Token.TokenType.Equal: break;

                case Token.TokenType.MinusEqual:
                    assignedValue = new Expr.Binary(expr, new Token(Token.TokenType.Minus, "-", null, equals.line), tempValue);
                    break;

                case Token.TokenType.PlusEqual:
                    assignedValue = new Expr.Binary(expr, new Token(Token.TokenType.Plus, "+", null, equals.line), tempValue);
                    break;

                case Token.TokenType.StarEqual:
                    assignedValue = new Expr.Binary(expr, new Token(Token.TokenType.Star, "*", null, equals.line), tempValue);
                    break;

                case Token.TokenType.SlashEqual:
                    assignedValue = new Expr.Binary(expr, new Token(Token.TokenType.Slash, "/", null, equals.line), tempValue);
                    break;

                case Token.TokenType.PercentEqual:
                    assignedValue = new Expr.Binary(expr, new Token(Token.TokenType.Percent, "%", null, equals.line), tempValue);
                    break;

                default: Basil.Error(Previous().line, "Tried to create assignment statement but tokens were invalid.");
                    break;
                }

                if (expr is Expr.Variable v)
                {
                    Token name = v.name;
                    return(new Expr.Assign(name, assignedValue));
                }
                else if (expr is Expr.Get)
                {
                    Expr.Get get = (Expr.Get)expr;
                    return(new Expr.Set(get.Objekt, get.Name, assignedValue));
                }
                Error(equals, "Invalid assignment target.");
            }
            //else if (Match(Token.TokenType.MinusEqual))
            //{
            //    Token equals = Previous();
            //    Expr value = Assignment();
            //    // replace assignment expression with (expr - value)
            //    Expr minusEquals = new Expr.Binary(expr, new Token(Token.TokenType.Minus, "-", null, equals.line), value);
            //    if (expr is Expr.Variable v)
            //    {
            //        Token name = v.name;

            //        return new Expr.Assign(name, minusEquals);
            //    }
            //    else if (expr is Expr.Get)
            //    {
            //        Expr.Get get = (Expr.Get)expr;
            //        return new Expr.Set(get.Objekt, get.Name, minusEquals);
            //    }
            //    Error(equals, "Invalid assignment target.");
            //}
            return(expr);
        }