Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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");
        }
Exemple #3
0
 public List(HlangList <Expr> values)
 {
     Values = values;
 }