akios @ ウィキ
2.4. 文法記法
最終更新:
akios
-
view
2. 文法
2.1. 文脈自由文法
2.2. 字句文法
2.3. 構文文法
2.4. 文法記法
wikiの仕様上、固定幅フォントやイタリック体等がつかえない(使うのが難しい)箇所があります。そのような箇所はwiki上では通常のフォントのままにしています。
字句文法や構文文法の生成規則の中の終端記号および本仕様中のそのような終端記号を直接参照する語は固定幅フォントで記述します。これらはプログラム中で正確に書かれる内容を表します。
非終端記号はイタリック体で記述します。非終端記号の定義は非終端記号の名前にコロンが続く形で始まります。次行以降にその終端記号の右辺値の候補が1つ以上続きます。
例えば、構文定義:
IfThenStatement:
if ( Expression ) Statement
if ( Expression ) Statement
は、非終端記号IfThenStatementはトークンifの次に左括弧トークン、次にExpression、次に右括弧トークン、次にStatementであることを表しています。
別な例で、構文定義:
ArgumentList:
Argument
ArgumentList , Argument
Argument
ArgumentList , Argument
は、ArgumentLIstが単一のArgumentかもしくはArgumentListの次にコンマ、その次にArgumentが続くもののいずれかであることを表しています。ArgumentListのこの定義は再帰的で、それ自身を右辺の中で使っています。結果として、ArgumentListは正の数の個数の引数を持つことができます。このような非終端記号の再帰的定義はありふれています。
終端記号や非終端記号の後にある小文字接尾語"opt"は省略可能記号(optional symbol)であることを表します。省略可能記号を持つ選択肢は実際には2つの右辺を意味します。1つは省略可能要素を省いたものでもう1つが含むものです。
これはつまり:
BreakStatement:
break Identifieropt ;
break Identifieropt ;
は次の便利な省略形です。:
BreakStatement:
break ;
break Identifier ;
break ;
break Identifier ;
そして:
BasicForStatement:
for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
は次の便利な省略形です。:
BasicForStatement:
for ( ; Expressionopt ; ForUpdateopt ) Statement
for ( ForInit ; Expressionopt ; ForUpdateopt ) Statement
for ( ; Expressionopt ; ForUpdateopt ) Statement
for ( ForInit ; Expressionopt ; ForUpdateopt ) Statement
これは今度は次の省略形です。:
BasicForStatement:
for ( ; ; ForUpdateopt ) Statement
for ( ; Expression ; ForUpdateopt ) Statement
for ( ForInit ; ; ForUpdateopt ) Statement
for ( ForInit ; Expression ; ForUpdateopt ) Statement
for ( ; ; ForUpdateopt ) Statement
for ( ; Expression ; ForUpdateopt ) Statement
for ( ForInit ; ; ForUpdateopt ) Statement
for ( ForInit ; Expression ; ForUpdateopt ) Statement
これは今度は次の省略形です。:
BasicForStatement:
for ( ; ; ) Statement
for ( ; ; ForUpdate ) Statement
for ( ; Expression ; ) Statement
for ( ; Expression ; ForUpdate ) Statement
for ( ForInit ; ; ) Statement
for ( ForInit ; ; ForUpdate ) Statement
for ( ForInit ; Expression ; ) Statement
for ( ForInit ; Expression ; ForUpdate ) Statement
for ( ; ; ) Statement
for ( ; ; ForUpdate ) Statement
for ( ; Expression ; ) Statement
for ( ; Expression ; ForUpdate ) Statement
for ( ForInit ; ; ) Statement
for ( ForInit ; ; ForUpdate ) Statement
for ( ForInit ; Expression ; ) Statement
for ( ForInit ; Expression ; ForUpdate ) Statement
このように非終端記号BasicForStatementの右辺は実際には8つの選択肢があります。
右辺がとても長い場合は、2行目にインデントを設けて続きます。
例として、構文文法には次の生成規則を含みます:
ConstructorDeclaration:
ConstructorModifiersopt ConstructorDeclarator
Throwsopt ConstructorBody
ConstructorModifiersopt ConstructorDeclarator
Throwsopt ConstructorBody
これは終端記号ConstructorDeclarationの右辺を1つだけ定義しています。
文法定義の中でコロンの後に"one of"という語があるときは、続く1行以上の行に書かれた各終端記号毎の個別定義の代替であることを意味します。
例えば、字句文法には次の生成規則があります。:
ZeroToThree: one of
0 1 2 3
0 1 2 3
これは次の便利な省略形です。:
ZeroToThree:
0
1
2
3
0
1
2
3
字句生成規則の右辺にトークンがある時、そのトークンを形成する文字の列を表しています。
この例として、定義:
BooleanLiteral: one of
true false
true false
が字句文法の生成規則にありますが、これは次の短縮形です。:
BooleanLiteral:
t r u e
f a l s e
t r u e
f a l s e
字句生成規則の右辺は"but not"を使った言い回しにより特定の展開が許可されない規則があります。これは、排除される展開パターンを示しています。
InputCharacter:
UnicodeInputCharacter but not CR or LF
UnicodeInputCharacter but not CR or LF
Identifier:
IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
最後に、全ての右辺を書ききることが実際には難しい場合があるので、いくつかの非終端記号はローマン体で表記する説明文で記述される場合があります。
例:
RawInputCharacter:
any Unicode character
any Unicode character