|  | 
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 <if_statement>.  <elseif> is simply an <if_statement>
//	in the false-branch of the preceeding <if_statement>
//	while <else> is simply an <if_statement> where the
//	<expr> 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 ) *
		)
	;
 |  |