目次 | |



2.文法

Javaプログラムの字句構造及び構文構造を定義するために,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の構文文法用の終端記号となる。これを,Javaトークン(tokens) (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)で始まる生成規則の集合を定義する。この生成規則の集合は,正しい構文の Javaプログラムを一連のトークンから作成する方法を規定する。

LALR(1)構文解析法による構文文法については,19.が規定する。この規定本文で用いる文法は, LALR(1)文法にとても似ているが,もっと読みやすくなっている。

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 に対して右辺を 一つ定義している("opt" が二つあるので,この右辺は4つの代替右辺を短縮している)。

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

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


目次 | |