Содержание | Предыдущий | Следующий | Индекс Спецификация языка Java
Второй Выпуск


ГЛАВА 2

Грамматики


Эта глава описывает бесконтекстные грамматики, используемые в этой спецификации, чтобы определить лексическую и синтаксическую структуру программы.

2.1 Бесконтекстные грамматики

Бесконтекстная грамматика состоит из многого производства. У каждого производства есть абстрактный символ, названный нетерминальным как его левая сторона, и последовательность одного или более нетерминальных и терминальных символов как ее правая сторона. Для каждой грамматики терминальные символы оттягиваются из указанного алфавита.

Запуск с предложения, состоящего из сингла, различал нетерминальный, названный целевым символом, данная бесконтекстная грамматика определяет язык, а именно, набор возможных последовательностей терминальных символов, которые могут следовать из повторной замены любого нетерминального в последовательности с правой стороной производства, для которого нетерминальной является левая сторона.

2.2 Лексическая Грамматика

Лексическая грамматика для языка программирования Java дается в (§3). Эта грамматика имеет как ее терминальные символы символы набора символов Unicode. Это определяет ряд производства, запускающегося с целевого Ввода символа (§3.5), которые описывают, как последовательности символов Unicode (§3.1) преобразовываются в последовательность входных элементов (§3.5).

Эти входные элементы, с пробелом (§3.6) и комментарии (§3.7) отброшенный, формируют терминальные символы для синтаксической грамматики для языка программирования Java и вызываются маркерами (§3.5). Эти маркеры являются идентификаторами (§3.8), ключевые слова (§3.9), литералы (§3.10), разделители (§3.11), и операторы (§3.12) языка программирования Java.

2.3 Синтаксическая Грамматика

Синтаксическая грамматика для языка программирования Java дается в Главах 4, 610-, 14, и 15. Этой грамматике определила маркеры лексическая грамматика как ее терминальные символы. Это определяет ряд производства, запускающегося с целевого символа CompilationUnit (§7.3), которые описывают, как последовательности маркеров могут сформировать синтаксически корректные программы.

2.4 Нотация грамматики

В терминальных символах показывают fixed width шрифт в производстве лексических и синтаксических грамматик, и всюду по этой спецификации всякий раз, когда текст непосредственно относится к такому терминальному символу. Они должны появиться в программе точно как записано.

Нетерминальные символы показывают в курсиве. Определение нетерминального представляется именем нетерминального, определяемого сопровождаемый двоеточием. Одна или более альтернативных правых сторон для нетерминального тогда следуют последующие строки. Например, синтаксическое определение:

IfThenStatement:
	if ( Expression ) Statement
состояния, что нетерминальный IfThenStatement представляет маркер if, сопровождаемый маркером левой круглой скобки, сопровождаемым Выражением, сопровождаемым маркером правой круглой скобки, сопровождаемым Оператором.

Как другой пример, синтаксическое определение:
ArgumentList:
	Argument
	ArgumentList , Argument
состояния, что ArgumentList может представить или единственный Параметр или ArgumentList, сопровождаемый запятой, сопровождаемой Параметром. Это определение ArgumentList является рекурсивным, то есть это определяется с точки зрения себя. Результат состоит в том, что ArgumentList может содержать любое положительное число параметров. Такие рекурсивные определения нетерминалов распространены.

Преобразованный в нижний индекс суффикс "выбирает", который может появиться после терминального или нетерминального, указывает на дополнительный символ. Альтернатива, содержащая дополнительный символ фактически, определяет две правых стороны, тот, который опускает дополнительный элемент и тот, который включает это.

Это означает что:

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 фактически есть восемь альтернативных правых сторон.

Очень длинная правая сторона может продолжаться на второй строке, существенно располагая эту вторую строку с отступом, как в:

ConstructorDeclaration:
	ConstructorModifiersopt ConstructorDeclarator
		Throwsopt ConstructorBody
который определяет одну правую сторону для нетерминального ConstructorDeclaration.

Когда слова "один из" следуют за двоеточием в определении грамматики, они показывают, что каждый из терминальных символов на следующей строке или строках является альтернативным определением. Например, лексическая грамматика содержит производство:

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) и Идентификатор (§3.8):

InputCharacter:
	UnicodeInputCharacter but not CR or LF
Identifier:
	IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
Наконец, несколько нетерминальных символов описываются дескриптивной фразой в римлянине, вводят случаи, где это было бы непрактично, чтобы перечислить все альтернативы:

RawInputCharacter:
	any Unicode character

Содержание | Предыдущий | Следующий | Индекс Спецификация языка Java
Второй Выпуск
Авторское право © Sun Microsystems, Inc 2000 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jls@java.sun.com



Spec-Zone.ru - all specs in one place