private IList <Block> ParseBlockList(IList <Clause> clauseList, ref int i) { var blockList = new List <Block>(); var encounteredBlockDelimiter = false; while (i < clauseList.Count && !encounteredBlockDelimiter) { switch (clauseList[i]) { case TextClause _: var textBlock = ParseTextBlock(clauseList, ref i); blockList.Add(textBlock); break; case IfClause _: var ifBlock = ParseIfBlock(clauseList, ref i); blockList.Add(ifBlock); break; case ForClause _: var forBlock = ParseForBlock(clauseList, ref i); blockList.Add(forBlock); break; case ElseIfClause _: case ElseClause _: case EndIfClause _: case EndForClause _: encounteredBlockDelimiter = true; break; case ExpressionClause c: var expressionBlock = new ExpressionBlock(c.Start, c.End, c.Expression); i++; blockList.Add(expressionBlock); break; default: throw ThrowHelper(clauseList[i].Start, ParsingError.UnknownClause); } } return(blockList); }
private void RenderExpression(Context ctx, ExpressionBlock b) { var v = Evaluate(ctx, b.Expression); ctx.Writer.Write(v.StringValue); }