Example #1
0
        public override object Visit(EachLoopAstNode node)
        {
            // First check that the loop variable doesn't already exist
            if (SymbolTable.Has(node.LoopVariableNode.Name))
            {
                throw new Exception($"Loop variable {node.LoopVariableNode.Name} at position {node.LoopVariableNode.Token.Position} is already defined!");
            }

            // Verify that the enumerable variable exists and is an enumerable
            var enumerable = SymbolTable.Get(node.EnumerableVariableNode.Name);
            var type       = enumerable.GetType();

            if (!typeof(IEnumerable).IsAssignableFrom(type))
            {
                throw new Exception($"{node.EnumerableVariableNode.Name} is not an Enumerable object at position {node.EnumerableVariableNode.Token.Position}");
            }

            // Concatenate output from the loop body
            var stringBuilder = new StringBuilder();

            foreach (var item in (IEnumerable)enumerable)
            {
                SymbolTable.Set(node.LoopVariableNode.Name, item);
                stringBuilder.Append(node.LoopBodyNode.Accept(this));
            }

            return(stringBuilder.ToString());
        }
Example #2
0
 public virtual object Visit(EachLoopAstNode node)
 {
     return(null);
 }