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()); }
public virtual object Visit(EachLoopAstNode node) { return(null); }