目次 | 前 | 次 | 索引 | Java言語規定 第2版 |
プログラムの字句構造及び構文構造を定義するために,2.は,この規定で使用する文脈自由文法を示す。
文脈自由文法は,単一の一意な非終端記号からなる文から出発して, 言語(language) を定義する。この非終端記号を目標記号 (goal symbol) と呼ぶ。定義される言語は,生成規則の左辺の非終端記号を右辺の終端記号又は非終端記号で繰り返し置き換えていくうちにたどりつく終端記号の無数の組合わせとする。
これらの入力要素から空白(3.6) 及び注釈 (3.7) を除いたものが,Javaプログラム言語の構文文法用の終端記号となる。これを,トークン(token) (3.5)と呼ぶ。これらのトークンは,Javaの識別子(3.8),キーワード (3.9),リテラル (3.10),分離子 (3.11),及び演算子 (3.12)とする。
固定幅(fixed width
)フォントで表示する。この規定中のテキストが直接終端記号を参照している場合も,同様とする。終端記号は,ここで記述されたとおりに,プログラムに記述する。非終端記号は イタリック(italic) で表示する。非終端記号の定義は,その終端記号の名前及びその直後のコロンによって始まる。非終端記号の次の行以降には,非終端記号を代替する 一つ又は複数の右辺が現れる。例えば,構文定義は,次に例示するとおりとなる。
この構文定義は,非終端記号 IfThenStatement が,IfThenStatement:if (
Expression)
Statement
if
トークン,左かっこトークン,Expression,右かっこトークン,Statement の順に並んだトークンの列であることを表現する。
別の構文定義を次に示す。
この構文定義は,ArgumentList が,単独の Argument か,コンマ及び Argument を従えた ArgumentList であることを表現する。ArgumentList は,再帰的(recursive) に定義される。つまり,ArgumentList はそれ自体によって定義される。結果として, ArgumentList は,任意の正の数の引数を取ることもできる。非終端記号では,この再帰的定義をよく行う。ArgumentList: Argument ArgumentList , Argument
下付き文字で表現する接尾辞 "opt" は,終端記号又は非終端記号の後に付加されることで,任意記号(optional symbol) を示す。任意記号を含む代替候補の表現は,任意要素を短縮した右辺と任意要素を含む右辺との二つの右辺を,実際には表現する。
この例を次に示す。
これは,次の表現を短縮している。BreakStatement: break Identifieropt ;
BreakStatement: break ; break Identifier ;
これは,次の表現を短縮している。ForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
これは,さらに次の表現を短縮している。ForStatement: for ( ; Expressionopt ; ForUpdateopt ) Statement for ( ForInit ; Expressionopt ; ForUpdateopt ) Statement
これは,さらに次の表現を短縮している。ForStatement: for ( ; ; ForUpdateopt ) Statement for ( ; Expression ; ForUpdateopt ) Statement for ( ForInit ; ; ForUpdateopt ) Statement for ( ForInit ; Expression ; ForUpdateopt ) Statement
つまり,非終端記号 ForStatement には,実際には八つの代替右辺がある。ForStatement: 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
右辺が長い場合は,次のとおりインデントを大きく付け,右辺が 2行目に続くことを示す。
この例は,非終端記号 ConstructorDeclaration に対して右辺を一つ定義しているConstructorDeclaration: ConstructorModifiersoptConstructorDeclarator Throwsopt
ConstructorBody
文法定義で "one of"という語句がコロンの後ろに続く場合は,次の行にある各終端記号がそれぞれ別の代替定義することを意味する。例えば,字句文法には,次に示す生成規則がある。
これは,単に次の規則を短縮している。ZeroToThree: one of0 1 2 3
字句の生成規則の代替右辺がトークンの場合,代替右辺はそのトークンを構成する文字の並びという意味になる。つまり,ZeroToThree:0
1
2
3
この字句文法の生成規則の例は,次の定義を短縮している。BooleanLiteral: one oftrue false
字句の生成規則の右辺では,特定の展開を行わないことを指定する場合がある。これには,次の InputCharacter (3.4)及び Identifier (3.8) の生成規則が示すとおりに,"but not" という語句を使用して,除外する展開を指定する。BooleanLiteral:t r u e f a l s e
すべての代替右辺を列挙できない場合は,次に例示するとおり,ローマン体で表示した説明的な句で非終端記号を記述することもある。InputCharacter: UnicodeInputCharacter but notCR
orLF
Identifier: IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
RawInputCharacter: any Unicode character
目次 | 前 | 次 | 索引 | Java言語規定 第2版 |