Пример #1
0
        private Expr MatchAssignment()
        {
            Expr expr = MatchEquality();

            if (Match(TokenType.EQUAL))
            {
                Token equal = ReadPrevToken();
                Expr  value = MatchAssignment();

                if (expr.GetType() == typeof(VariableExpr))
                {
                    Token name = ((VariableExpr)expr).name;
                    return(new AssignExpr(name, value));
                }
                else if (expr.GetType() == typeof(GetExpr))
                {
                    GetExpr gexpr = (GetExpr)expr;
                    return(new SetExpr(gexpr.obj, gexpr.name, value));
                }

                ReportError("Invalid assignment target.");
            }

            return(expr);
        }
Пример #2
0
        private Expr Call()
        {
            var expr = Primary();

            while (true)
            {
                if (Match(TokenType.LeftParen))
                {
                    expr = FinishCall(expr);
                }
                else if (Match(TokenType.Dot))
                {
                    var name = Consume(TokenType.Identifier, "Expect property name after '.'.");
                    expr = new GetExpr(expr, name);
                }
                else
                {
                    break;
                }
            }

            return(expr);
        }
Пример #3
0
        private Expr MatchCallExpr()
        {
            Expr expr = MatchPrimary();

            while (true)
            {
                if (Match(TokenType.LEFT_PAREN))
                {
                    List <Expr> args = new List <Expr>();
                    do
                    {
                        if (Check(TokenType.RIGHT_PAREN) == false)
                        {
                            if (args.Count >= 8)
                            {
                                ReportError("Cannot have more then 8 arguments.");
                            }
                            args.Add(MatchExpression());
                        }
                    } while (Match(TokenType.COMMA));
                    Token paren = Consume(TokenType.RIGHT_PAREN, "Expect ')' after arguments.");

                    expr = new CallExpr(expr, paren, args);
                }
                else if (Match(TokenType.DOT))
                {
                    Token name = Consume(TokenType.IDENTIFIER, "Expect property name after '.'.");
                    expr = new GetExpr(expr, name);
                }
                else
                {
                    break;
                }
            }

            return(expr);
        }
Пример #4
0
 protected abstract object MatchGetExpr(GetExpr getExpr);
Пример #5
0
 protected override object MatchGetExpr(GetExpr expr) => Resolve(expr.Object);
Пример #6
0
 public virtual void Visit(GetExpr expr)
 {
 }
Пример #7
0
 public override void Visit(GetExpr expr)
 {
     expr.obj.Accept(this);
 }
Пример #8
0
 public override void Visit(GetExpr expr)
 {
     expr.obj.Accept(this);
     AddStr("." + expr.name.lexeme);
 }