You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by we...@locus.apache.org on 2000/09/13 04:17:34 UTC

cvs commit: jakarta-velocity/specification velocity-ast

werken      00/09/12 19:17:34

  Added:       specification velocity-ast
  Log:
  Beginnings of documentation of AST/intermediate form
  for communication between Parser-Of-Choice and the
  backside introspection engine.
  
  Revision  Changes    Path
  1.1                  jakarta-velocity/specification/velocity-ast
  
  Index: velocity-ast
  ===================================================================
  
  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 ) *
  		)
  	;