<?xml version="1.0" encoding="Shift_JIS" ?>

<document>

 <properties>
  <title>Velocity Specification - BNF</title>
  <author email="jon@latchkey.com">Velocity Documentation Team</author>
  <translator>熊坂祐二</translator>
  <translator>高橋達男</translator>
  <original>specification-bnf</original>
 </properties>

<body>

<section name="Velocity の仕様 - BNF">

<p>
これは古いため、近日中に更新する予定ですのでご注意ください。
</p>

<source><![CDATA[
Velocity向けの仮のBNFですが、今のところほとんど WM (WebMacro) の構文と同じです。
この仕様はおそらく変更されるでしょう。というのは、
計算式について構文に組み込まれていないのと、将来のVelocityの構文では、
指示子の終わりを示すのに使われていたブロックマーカーを廃止し、
代わりに「#end」トークンを使用する可能性が高いからです。

<statement>         
    
    ::=   <text>
        | <block>
        | <if-statement>
        | <else-if-statement>
        | <foreach-statement>
        | <include-statement>
        | <set-statement>
        | <parse-statement>
        | <param-statment>
        | <stop-statement>
        | <reference>

<block>
    
    ::= "#begin" { <expresion> } "#end"

<if-statement>
    
    ::= "#if" "(" <expresion> ")" <statement> [ <else-statement> ]


<else-if-statement> 

    ::= "#elseif" "(" <expresion> ")" <statement> [ <else-statement> ]

<foreach-statement> 

    ::= "#foreach" <reference> "in" <reference> <statement>

<include-statement> 

    ::= "#include" <string-literal>

<set-statement>     

    ::= "#set" <reference> "=" <expression>

<parse-statement>   

    ::= "#parse" <string-literal>

<param-statment>    

    ::= "#param" <reference> "=" <string-literal>

<stop-statement>    

    ::= "#stop"

<reference>         

    ::= "$" <identifier> { "." <method> | <identifier> }

<method>            

    ::= <identifier> "(" [ <parameter> { "," <parameter> } ] ")"

<parameter>         

    ::= <reference> | <string-literal>

<alpha-char>

    ::= "a..z, A..Z"

<identifier-char>   

    ::= "a..z, A..Z ,0..9 ,- ,_"

<identifier>        

    ::= <alpha-char> { <identifier-char> }

<expression>        

    ::=   <true>
        | <false>
        | <primary-expression> "=" <assignment>
        | <conditional-or-expression>
                        
<assignment>        
    
    ::= <primary-expression> "=" <assignment>

<conditional-or-expression>

    ::= <conditional-and-expression> { "||" <conditional-and-expression> }
                            
<conditional-and-expression>

    ::= <equality-expression> { "&&" <equality-expression> }
                        
<equality-expression>

    ::= <relational-expression>
        {     "==" <relational-expression> 
            | "!=" <relational-expression> 
        }
                        
<relational-expression>

    ::= <additive-expression>
        {
              "<"  <additive-expression>
            | ">"  <additive-expression>
            | "<=" <additive-expression>
            | ">=" <additive-expression>
        }
                        
<additive-expression>

    ::= <multiplicative-expression>
        {
              "+" <multiplicative-expression>
            | "-" <multiplicative-expression>
        }
                        
<multiplicative-expression>

    ::= <unary-expression>
        {
              "*" <unary-expression>
            | "/" <unary-expression>
            | "%" <unary-expression>
        }
                        
<unary-expression>

    ::= "!" <unary-expression> | <primary-expression>
                
<primary-expression>

    ::=   <string-literal>
        | <number-literal>
        | <reference>
        | "(" <expression> ")"

]]></source>

</section>

</body>
</document>
