C言語のBNFを眺める
拡張的な文法。
<pointer> ::= * {<type-qualifier>}* {<pointer>}?
pointerは* 複数のtype-qualifierという構造を繰り返し書ける?
<type-qualifier> ::= const | volatile
つまり* const const const * const * volatile volatileみたいなものもBNF上はpointerとしてはValid?
<declarator> ::= {<pointer>}? <direct-declarator>
code:direct-declarator
<direct-declarator> ::= <identifier>
| ( <declarator> )
| <direct-declarator> ( <parameter-type-list> )
| <direct-declarator> ( {<identifier>}* )
(* const (* const volatile arr[][]] )[][][] )(arr2 arr3)
このようなものもdirect-declaratorにあたる
つまり、direct-declaratorを()でくくってpointerを付加したり、うしろに[]や(引数リスト)を付けたりしても、direct-declaratorとして認められるということ
<declaration-specifier> ::= <storage-class-specifier> | <type-specifier> | <type-qualifier>
ストレージクラス指定子(externとかregisterとか)
または型指定子(intとかfloatとか)
または型修飾子(constとかvolatileとか)
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
例
int x;
intがdeclaration-specifierで、xがinit-declarator(今回はdeclarator)
int x = 0, y = 3, z = 5;みたいな構造
intがdeclaration-specifierで、x = { 0, 5, }, y =
code:init-declarator
<init-declarator> ::= <declarator>
| <declarator> = <initializer>
<initializer> ::= <assignment-expression>
| { <initializer-list> }
| { <initializer-list> , }
<initializer-list> ::= <initializer>
| <initializer-list> , <initializer>
init-declaratorは、宣言部または宣言部 = 初期化という構造
初期化: 式か、式を{}でくくって複数並べたもの
<function-definition> ::= {<declaration-specifier>}* <declarator> {<declaration>}* <compound-statement>
declaratorは、関数の宣言部を表しているだろう
declarationを0個以上複数書けるのはどういうこと?
compound-statementは、関数のボディ部({ 変数宣言; 文; })