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); }
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); }
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); }
protected abstract object MatchGetExpr(GetExpr getExpr);
protected override object MatchGetExpr(GetExpr expr) => Resolve(expr.Object);
public virtual void Visit(GetExpr expr) { }
public override void Visit(GetExpr expr) { expr.obj.Accept(this); }
public override void Visit(GetExpr expr) { expr.obj.Accept(this); AddStr("." + expr.name.lexeme); }