|
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 ) *
)
;
|
|