/** Create an evaluator using attributes from self */ public ActionEvaluator(StringTemplate self, ASTExpr chunk, StringTemplateWriter @out) { this.self = self; this.chunk = chunk; this.@out = @out; }
/// <summary>A separator is normally just a string literal, but is still an AST that /// we must evaluate. The separator can be any expression such as a template /// include or string cat expression etc... /// </summary> protected internal virtual String computeSeparator(StringTemplate self, StringTemplateWriter outWriter, Object separator) { if (separator == null) { return null; } if (separator is StringTemplateAST) { StringTemplateAST separatorTree = (StringTemplateAST) separator; // must evaluate, writing to a string so we can hand on to it ASTExpr e = new ASTExpr(getEnclosingTemplate(), separatorTree, null); System.IO.StringWriter buf = new System.IO.StringWriter(); // create a new instance of whatever StringTemplateWriter // implementation they are using. Default is AutoIndentWriter. // Defalut behavior is to indent but without // any prior indents surrounding this attribute expression StringTemplateWriter sw = null; System.Type writerClass = outWriter.GetType(); try { System.Reflection.ConstructorInfo ctor = writerClass.GetConstructor(new System.Type[]{typeof(System.IO.TextWriter)}); sw = (StringTemplateWriter) ctor.Invoke(new Object[]{buf}); } catch (System.Exception exc) { // default new AutoIndentWriter(buf) self.error("cannot make implementation of StringTemplateWriter", exc); sw = new AutoIndentWriter(buf); } try { e.write(self, sw); } catch (System.IO.IOException ioe) { self.error("can't evaluate separator expression", ioe); } return buf.ToString(); } else { // just in case we expand in the future and it's something else return separator.ToString(); } }
public virtual ASTExpr parseAction(String action) { ActionLexer lexer = new ActionLexer(new System.IO.StringReader(action.ToString())); ActionParser parser = new ActionParser(lexer, this); parser.setASTNodeClass("antlr.stringtemplate.language.StringTemplateAST"); ASTExpr a = null; try { IDictionary options = parser.action(); AST tree = parser.getAST(); if (tree != null) { if (tree.Type == ActionParser.CONDITIONAL) { a = new ConditionalExpr(this, tree); } else { a = new ASTExpr(this, tree, options); } } } catch (RecognitionException re) { error("Can't parse chunk: " + action.ToString(), re); } catch (TokenStreamException tse) { error("Can't parse chunk: " + action.ToString(), tse); } return a; }