This is tentatively the AST structure for Velocity. The structure is as would be described using ANTLR BNF-style notation. A tree is described by #(node node node) where #() represents the tree form. The first node is the root of the tree, and following nodes are all children. Visually, #(A B C D E) might look like: A | B-C-D-E Root nodes must always be a terminal node, denoted by an all-caps identifier. Non-root nodes may be either terminal nodes, or sub-rules, or inlined sub-trees. A sub-rule might describe a tree, or simple a node. block : #( BLOCK (statement)* ) ; statement : text | if_statement | foreach_statement | include_statement | set_statement | parse_statement | param_statement | stop_statement | reference ; text : TEXT ; // if/elseif/else chains should be represented solely // by . is simply an // in the false-branch of the preceeding // while is simply an where the // evaluates to TRUE always, and no false-branch // is provided. if_statement : #( IF // The expression to test expr // True branch block // False branch ( block )? ) ; foreach_statement : #( FOREACH // Value to assign for each iteration reference // List of objects to iterator reference // command-block to execute block ) ; set_statement : #( SET // Variable to set reference // Value to assign expr ; parse_statement : #( PARSE STRING_LITERAL ) ; include_statement : #( INCLUDE STRING_LITERAL ) ; stop_statement : STOP ; reference : #( REFERENCE postfix ; postfix : method_call | member | identifier ; member : #( DOT identifier ( primary | method_call ) ; primary : IDENTIFIER ; method_call #( CALL postfix // The argument list ( expr ) * ) ;