Spec-Zone.ru › Java Language Specification 21

Глава 2. Грамматики

Оглавление

2.1. Безконтекстные грамматики
2.2. Лексическая грамматика
2.3. Синтаксическая грамматика
2.4. Запись грамматики

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

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

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

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

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

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

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

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

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

Для удобства синтаксическая грамматика представлена целиком в главе 19.

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

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

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

Например, синтаксическое определение:

IfThenStatement:
if ( Expression ) Statement

указывает, что нетерминал IfThenStatement представляет собой токен if, за которым следует токен левой скобки, за которым следует Expression, за которым следует токен правой скобки, за которым следует Statement.

Синтаксис {x} в правой части определения обозначает ноль или более вхождений x.

Например, синтаксическое определение:

ArgumentList:
Argument {, Argument}

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

Синтаксис [x] в правой части определения обозначает ноль или одно вхождение x. То есть x — это необязательный символ. Альтернатива, которая содержит необязательный символ, на самом деле определяет две альтернативы: одну, которая опускает необязательный символ, и одну, которая его включает.

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

BreakStatement:
break [Identifier] ;

является удобным сокращением для:

BreakStatement:
break ;
break Identifier ;

В качестве другого примера это означает, что:

BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

является удобным сокращением для:

BasicForStatement:
for ( ; [Expression] ; [ForUpdate] ) Statement
for ( ForInit ; [Expression] ; [ForUpdate] ) Statement

что, в свою очередь, является сокращением для:

BasicForStatement:
for ( ; ; [ForUpdate] ) Statement
for ( ; Expression ; [ForUpdate] ) Statement
for ( ForInit ; ; [ForUpdate] ) Statement
for ( ForInit ; Expression ; [ForUpdate] ) 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

поэтому нетерминал BasicForStatement на самом деле имеет восемь альтернативных правых частей.

Очень длинная правая часть может быть продолжена на второй строке путем четкого отступа второй строки.

Например, синтаксическая грамматика содержит следующее определение:

NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [ClassExtends] [ClassImplements] [ClassPermits] ClassBody

которое определяет одну правую часть для нетерминала NormalClassDeclaration.

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

Например, лексическая грамматика содержит определение:

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

Правая часть определения может указывать, что определенные расширения не допускаются, используя фразу «но не», а затем указывая расширения, которые необходимо исключить.

Например:

Identifier:
IdentifierChars but not a ReservedKeyword or BooleanLiteral or NullLiteral

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

Например:

RawInputCharacter:
any Unicode character

© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API