目次 | | | 索引 Java言語規定
第2版

2. 文法

プログラムの字句構造及び構文構造を定義するために,2.は,この規定で使用する文脈自由文法を示す。

2.1 文脈自由文法

文脈自由文法(context-free grammar) は,多数の 生成規則(productions) から構成される。各生成規則には,左辺(left-hand side)非終端記号 (nonterminal) と呼ぶ抽象記号があり,右辺(right-hand side) に 一つ又は複数の非終端記号 (nonterminal)及び終端記号 (terminal) の並びがある。終端記号は,文法に固有の アルファベット(alphabet) から作成される。

文脈自由文法は,単一の一意な非終端記号からなる文から出発して, 言語(language) を定義する。この非終端記号を目標記号 (goal symbol) と呼ぶ。定義される言語は,生成規則の左辺の非終端記号を右辺の終端記号又は非終端記号で繰り返し置き換えていくうちにたどりつく終端記号の無数の組合わせとする。

2.2 字句文法

Javaプログラム言語の 字句文法(lexical grammar) については,3.で規定する。この文法は,終端記号としてUnicode文字集合の文字を使用する。この文法は,目標記号 Input (3.5)で始まる生成規則の集合を定義する。この生成規則の集合は,Unicode文字の並び (3.1)を入力要素 (3.5)の並びに変換する方法を示す。

これらの入力要素から空白(3.6) 及び注釈 (3.7) を除いたものが,Javaプログラム言語の構文文法用の終端記号となる。これを,トークン(token) (3.5)と呼ぶ。これらのトークンは,Javaの識別子(3.8),キーワード (3.9),リテラル (3.10),分離子 (3.11),及び演算子 (3.12)とする。

2.3 構文文法

Javaプログラム言語の 構文文法(syntactic grammar)は,4.6.10.14.,及び15.が規定する。この文法は,字句文法によって終端記号として定義された Javaトークンを使用する。この文法は,目標記号CompilationUnit (7.3)で始まる生成規則の集合を定義する。この生成規則の集合は,正しい構文のプログラムをトークンの並びから作成する方法を規定する。

2.4 文法記法

終端記号は,字句文法及び構文文法の生成規則中では,固定幅(fixed width)フォントで表示する。この規定中のテキストが直接終端記号を参照している場合も,同様とする。終端記号は,ここで記述されたとおりに,プログラムに記述する。

非終端記号は イタリック(italic) で表示する。非終端記号の定義は,その終端記号の名前及びその直後のコロンによって始まる。非終端記号の次の行以降には,非終端記号を代替する 一つ又は複数の右辺が現れる。例えば,構文定義は,次に例示するとおりとなる。

IfThenStatement:
	if ( Expression ) 
	Statement
この構文定義は,非終端記号 IfThenStatement が,if トークン,左かっこトークン,Expression,右かっこトークン,Statement の順に並んだトークンの列であることを表現する。
別の構文定義を次に示す。
ArgumentList:
	Argument
	ArgumentList , Argument
この構文定義は,ArgumentList が,単独の Argument か,コンマ及び Argument を従えた ArgumentList であることを表現する。ArgumentList は,再帰的(recursive) に定義される。つまり,ArgumentList はそれ自体によって定義される。結果として, ArgumentList は,任意の正の数の引数を取ることもできる。非終端記号では,この再帰的定義をよく行う。

下付き文字で表現する接尾辞 "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:
	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
つまり,非終端記号 ForStatement には,実際には八つの代替右辺がある。

右辺が長い場合は,次のとおりインデントを大きく付け,右辺が 2行目に続くことを示す。

ConstructorDeclaration:
	ConstructorModifiersopt ConstructorDeclarator
		Throwsopt ConstructorBody
この例は,非終端記号 ConstructorDeclaration に対して右辺を一つ定義している

文法定義で "one of"という語句がコロンの後ろに続く場合は,次の行にある各終端記号がそれぞれ別の代替定義することを意味する。例えば,字句文法には,次に示す生成規則がある。

ZeroToThree: one of
	0 1 2 3
これは,単に次の規則を短縮している。

ZeroToThree:
	0
	1
	2
	3
字句の生成規則の代替右辺がトークンの場合,代替右辺はそのトークンを構成する文字の並びという意味になる。つまり,

BooleanLiteral: one of
	true false
この字句文法の生成規則の例は,次の定義を短縮している。

BooleanLiteral:
	t r u e
	f a l s e
字句の生成規則の右辺では,特定の展開を行わないことを指定する場合がある。これには,次の InputCharacter (3.4)及び Identifier (3.8) の生成規則が示すとおりに,"but not" という語句を使用して,除外する展開を指定する。

InputCharacter:
	UnicodeInputCharacter but not CR or LF
Identifier:
	IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
すべての代替右辺を列挙できない場合は,次に例示するとおり,ローマン体で表示した説明的な句で非終端記号を記述することもある。

RawInputCharacter:
	any Unicode character

目次 | | | 索引 Java言語規定
第2版