1 / 17

StringTemplate

StringTemplate. Terence Parr University of San Francisco parrt@cs.usfca.edu. Outline. What is StringTemplate Operations Semantics Example Java/XML Generation ANTLR 3.0 template. What is StringTemplate?.

etana
Télécharger la présentation

StringTemplate

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. StringTemplate Terence Parr University of San Francisco parrt@cs.usfca.edu

  2. Outline • What is StringTemplate • Operations • Semantics • Example Java/XML Generation • ANTLR 3.0 template

  3. What is StringTemplate? • Template engine designed with Tom Burns (CEO, jGuru.com) while building commercial sites over many years in response to JSP • small: 170k uncompressed binary (w/o test rig) • Evolved from simple “document with holes” into a functional language capable of generating large class of languages • Well suited to generative programming as well as dynamic page generation; being used in new ANTLR parser generator for code generation • Distinguishing characteristic: strictly enforces separation of model and view

  4. Argument for StringTemplate • Car aerodynamics mostly trumps style today • Similarly, the nature of generating text should dominate design decisions: use an output grammar • Don’t have output grammars, we have programs with print statements; template engines arose to encourage separation of logic/display. • Enforcing strict separation also leads to similar grammar-like mechanism • Conclusion: if you’re generating text, you should be using something akin to StringTemplate

  5. Canonical Operations • Attribute reference:<type> • Template references (possibly recursive):<statementList()> • Apply template to multi-valued attribute:<decls:decl()>or<decls:{<it.type> <it.name>;}><items:red(), blue(), green()> • Conditional include:<if(superClass)>extends <superClass><endif><if(name)>Name: <name><else>Guest<endif>

  6. Semantics • Side-effect free expressions • No “state” • No defined order of execution • Lazy evaluation (crucial!) • Dynamically scoped; values inherited • Template inheritance: group to subgroup • Recursive template instantiation

  7. Template Groups • Set of mutually-referential templates with formal arguments group javaTemplates; method(type,name,args,body) ::= << public <type> <name>( <args:arg(); separator=“,”> ) { <body> } >> assign(lhs,expr) ::= “<lhs> = <expr>;” if(expr,stat) ::= “if (<expr>) <stat>” call(name,args) ::= “<name>( <args; separator=“,”> );” …

  8. Example: Dump Java Class • Expected output: class Dump { public int i; public java.lang.String name; public int[] data; public void main(class java.lang.String[] arg1); public void foo(int arg1, float[] arg2); public class java.lang.String bar(); }

  9. Dump Java Class Templates group Java; class(name,fields,methods) ::= << class <name> { <fields:field(); separator="\n"> <methods:method(); separator="\n"> > } >> field() ::= "public <type(t=it.type)> <it.name>;" method() ::= << public <it.returnType> <it.name> (<it.parameterTypes:{<type(t=it)> arg<i>}; separator=", ">); >> type(t) ::= << <if(t.componentType)><t.componentType>[] <else><t.name><endif> >>

  10. Dump Java Class Code public class Dump { public int i; public String name; public int[] data; public static void main(String[] args) throws IOException { StringTemplateGroup group = new StringTemplateGroup(new FileReader("Java.stg"), AngleBracketTemplateLexer.class); Class c = Dump.class; Field[] fields = c.getFields(); Method[] methods = c.getDeclaredMethods(); StringTemplate classST = group.getInstanceOf("class"); classST.setAttribute("name", c.getName()); classST.setAttribute("fields", fields); classST.setAttribute("methods", methods); System.out.println(classST); } public void foo(int x, float[] y) {;} public String bar() {return "";} }

  11. Dump XML Instead group XML; class(name,fields,methods) ::= << <class> <name>$name$</name> $fields:field()$ $methods:method()$ </class> >> field() ::= << <field> <type>$type(t=it.type)$</type><name>$it.name$</name> </field> >> … <class> <name>Dump</name> <field> <type>int</type><name>i</name> </field> … </class>

  12. Sample ANTLR 3.0 Template parser(name, tokens, rules, DFAs) ::= << class <name> extends Parser { <tokens: {public static final int <it.name>=<it.type>;} > public <name>(TokenStream input) { super(input); } <rules; separator="\n"> <DFAs> } >>

  13. ANTLR 3.0 Error Templates • Internationalization: use a template group for each locale; load appropriate templates RULE_REDEFINITION(file,line,col,arg) ::= "<loc()>rule <arg> redefinition” UNDEFINED_RULE_REF(file,line,col,arg) ::= "<loc()>reference to undefined rule: <arg>” loc() ::= "<file>:<line>:<col>: " inherits file, line, col attributes from enclosing template

  14. Language Translation • MVC (parser + “unparser”) • model -- input stream and/or ASTs • view -- templates • controller -- parser • Controller extracts data from model, provides to view without worrying about details of output structure • Maps abstract input concept to output concept like assignment to assignment. • Abstract concepts represented by one or more rules in parser grammar and one or more templates in template file

  15. Translation grammar+ST variable returns [StringTemplate code=null] {StringTemplate t=null,d=null;} : t=type d=declarator SEMI { if ( currentFunctionName==null ) { code = template("globalVariable"); } else { code = template("variable"); } code.setAttribute("type", t); code.setAttribute("name", d); } ; declarator returns [StringTemplate code=null] : id:ID {code=text(id.getText());} ;

  16. Translation Templates • Javavariable(type,name)::="<type> <name>;”globalVariable ::= variable • Pythonvariable(type,name) ::= " ”globalVariable ::= variable • Bytecodesvariable(type,name) ::= ".var is <name> <type>" globalVariable(type,name) ::= ".field <name> <type><\n>"

  17. Summary • The nature of text generation and the enforcement of model-view separation dominate tool design-decisions: • tools should resemble output grammars • StringTemplate is a simple template engine that evolved while building dynamic sites. It is proving exceptionally well suited to code generation tasks including ANTLR 3.0 • Open-source Java, BSD license (also a C# port; python coming) • Links • http://www.stringtemplate.org • http://www.codegeneration.net/tiki-read_article.php?articleId=77

More Related