/// <summary> /// Evaluate a list expression /// </summary> /// <param name="expr">List expression to evaluate</param> /// <returns>Evaluated list</returns> public object VisitListExpr(List expr) { HlangList <object> values = new HlangList <object>(); foreach (var item in expr.Values) { values.Add(Evaluate(item)); } return(values); }
/// <summary> /// Parse a primary expression /// </summary> /// <returns>A primary expression node</returns> private Expr Primary() { // return string, number, bool, or 'nothing' literal if (Match(TokenType.FALSE)) { return(new Literal(false)); } if (Match(TokenType.TRUE)) { return(new Literal(true)); } if (Match(TokenType.NOTHING)) { return(new Literal(null)); } if (Match(TokenType.NUMBER, TokenType.STRING)) { return(new Literal(Previous().Literal)); } // return identifier or grouping if (Match(TokenType.IDENTIFER)) { return(new Variable(Previous())); } if (Match(TokenType.LEFT_PAREN)) { Expr expr = Expression(); Consume(TokenType.RIGHT_PAREN, "Expect ')' after expression"); return(new Grouping(expr)); } // return list literal if (Match(TokenType.LEFT_BRACKET)) { HlangList <Expr> values = new HlangList <Expr>(); while (!Match(TokenType.RIGHT_BRACKET)) { if (!Check(TokenType.COMA)) { values.Add(Primary()); } else { Advance(); } } return(new List(values)); } if (Match(TokenType.THIS)) { return(new This(Previous())); } if (Match(TokenType.PARENT)) { return(FinishParentCall(Previous())); } throw new ParsingError(Peek(), "Expected an expression"); }
public List(HlangList <Expr> values) { Values = values; }