Chapter08

1. イントロダクション
2. 概要
3. 字句構造
4. 全体的な構文...
5. データ型
6. 言語構文
7. 標準ライブラリ関数
8. **形式言語文法**
9. シェーダグループの記述
10. 用語集
11. Light Path Ex...

このセクションでは、Open Shading Languageの完全な構文について説明しています。
"-opt"で終わる名前の統語構造は、任意です。中括弧**{ }**で閉じられた構造は、0以上の回数で繰り返すことができます。
タイプライター書体のテキストは、文字通りのテキストを意味します。

ϵ

{\displaystyle \epsilon}

文字を使用して、それが何も受け入れることができない(空っぽ、トークンなし)ことを意味しています。

<digit-sequence> ::= <digit> { <digit> }

<hexdigit-sequence> ::= <hexdigit> { <hexdigit> }

<integer> ::= <sign> <digit-sequence>

<floating-point> ::= <digit-sequence> <decimal-part-opt> <exponent-opt>

<decimal-part> ::= ‘.’ { <digit> }

<exponent> ::= ‘e’ <sign> <digit-sequence>

<sign> ::= ‘-’ | ‘+’ | ε

<number> ::= <integer>

<char-sequence> ::= { <any-char> }

<stringliteral> ::= ‘"’ <char-sequence> ‘"’

<identifier> ::= <letter-or-underscore> { <letter-or-underscore-or-digit> }

```

<global-declaration> ::= <function-declaration>

<shader-declaration> ::=
    <shadertype> <identifier> <metadata-block-opt> ( <shader-formal-params-opt> ) {
    <statement-list> }

<shadertype> ::= displacement | shader | surface | volume

<shader-formal-params> ::= <shader-formal-param> { , <shader-formal-param> }

<shader-formal-param> ::= <outputspec> <typespec> <identifier> <initializer> <metadata-block-opt>

<metadata-block> ::= [[ <metadata> { , <metadata> } ]]

<metadata> ::= <simple-typespec> <identifier> <initializer>

```

### 宣言

```
<function-declaration> ::=
    <typespec> <identifier> < <function-formal-params-opt> > { <statement-list> }

<function-formal-params> ::= <function-formal-param> { , <function-formal-param> }

<function-formal-param> ::= <outputspec> <typespec> <identifier> <arrayspec-opt>

<outputspec> ::= output | ε

<struct-declaration> ::= struct <identifier> { <field-declarations> } ;

<field-declarations> ::= <field-declaration> { <field-declaration> }

<field-declaration> ::= <typespec> <typed-field-list> ;

<typed-field-list> ::= <typed-field> { , <typed-field> }

<typed-field> ::= <identifier> <arrayspec-opt>

<local-declaration> ::= <function-declaration>

<arrayspec> ::= [ <integer> ]

<variable-declaration> ::= <typespec> <def-expressions> ;

<def-expressions> ::= <def-expression> { , <def-expression> }

<def-expression> ::= <identifier> <initializer-opt>

<initializer> ::= = <expression>

<initializer-list> ::= = <compound-initializer> <compound-initializer> ::= { <init-expression-list> }

<init-expression-list> ::= <init-expression> { , <init-expression> }

<init-expression> ::= <expression> | <compound-initializer>

<typespec> ::= <simple-typename>

```

### ステートメント

```
<statement-list> ::= <statement> { <statement> }

<statement> ::= <compound-expression-opt> ;

<scoped-statements> ::= { <statement-list-opt> }

<conditional-statement> ::=
      if ( <compound-expression> ) <statement>

<loop-statement> ::=
      while ( <compound-expression> ) <statement>
      ) <statement>

<for-init-statement> ::=
      <expression-opt> ;

<loopmod-statement> ::= break ;

<return-statement> ::= return <expression-opt> ;

```

### エクスプレッション

```
<expression-list> ::= <expression> { , <expression> } <expression> ::= <number>

<compound-expression> ::= <expression> { , <expression> }

<variable-lvalue> ::= <identifier> <array-deref-opt> <component-deref-opt>

<variable-ref > ::= <identifier> <array-deref-opt>

<binary-op> ::= * | / | %

<unary-op> ::= - | ˜ | ! | not

<incdec-op> ::= ++ | --

<type-constructor> ::= <typespec> ( <expression-list> )

<function-call> ::= <identifier> ( <function-args-opt> )

<function-args> ::= <expression> { , <expression> }

<assign-expression> ::= <variable-lvalue> <assign-op> <expression>

<ternary-expression> ::= <expression> ? <expression> : <expression>

<typecast-expression> ::= ( <simple-typename> ) <expression>

```