<?xml version="1.0" encoding="Shift_JIS" ?>

<document>

 <properties>
  <title>Velocity Specification - AST</title>
  <author email="jon@latchkey.com">Velocity Documentation Team</author>
  <translator>熊坂祐二</translator>
  <translator>高橋達男</translator>
  <translator>小山博史</translator>
  <original>specification-ast</original>
 </properties>

<body>

<section name="Velocity Specification - AST" alias="Velocity の仕様 - AST">

<primary>
<p>
Please note that this is currently out of date and will be updated soon.
</p>
</primary>
<p>
これは古いため、近日中に更新する予定であることにご注意ください。
</p>

<primary>
<source><![CDATA[
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 ) *
		)
	;
]]></source>
</primary>
<source><![CDATA[
これは Velocity のための仮のAST構造です。

構造は、ANTLR BNF形式の表記法で記述しています。
ツリーは、#(ノード ノード ノード)で記述されています。
ここで #()は、ツリーフォームを表します。
最初のノードは、ツリーのrootで、以下のノードは
すべて子です。

図示すると, #(A B C D E) は、このようになります:

     A
     |
     B-C-D-E

rootノードは、つねに終端ノードでなければならず、
すべて大文字の識別子で表記されます。

非rootノードは、終端ノードやサブルールやインラインサブツリー
となります。

サブルールは、ツリーもしくは単純にノードとして記述されます。


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 の連鎖は、<if_statement>だけで表現できます。
//      <elseif>は、直前の<if_statement>のfalse分岐におかれた
//      <if_statement>に過ぎませんし、<else>は<expr>の評価が常に
//      TRUEでfalse分岐のない<if_statement>に過ぎません。

if_statement
	:
		#(	IF
				// 評価される式
				expr

				// 真の分岐
				block

				// 偽の分岐
				( block )?
		)
	;

foreach_statement
	:
		#(	FOREACH
				// それぞれの繰り返しで使われる変数(リファレンス) 
				// [訳注：ValueはVariableの間違いでは？]
				reference
				// 繰り返されるオブジェクトのリスト
				reference
				// 実行するコマンドブロック
				( block )?
		)
	;

set_statement
	:
		#(	SET
				// セットされる変数
				reference
				// 割り当てる値
				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
				// 引数のリスト
				( expr ) *
		)
	;
]]></source>

</section>

</body>
</document>
