Spec-Zone.ru › Java Language Specification 24

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

Оглавление

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

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

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

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

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

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

Лексическая грамматика для языка программирования Java приведена в §3 (Лексическая структура). В этой грамматике в качестве терминальных символов выступают символы набора символов Юникод. Она определяет набор производных правил, начиная с символа цели Вход (§3.5), которые описывают, как последовательности символов Юникод (§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 в продукциях лексических и синтаксических грамматик, а также во всей этой спецификации, когда текст напрямую ссылается на такой терминальный символ. Они должны появляться в программе точно так, как написано.

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

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

IfThenStatement:
if ( Expression ) Statement

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

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

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

ArgumentList:
Argument {, Argument}

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

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

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

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.

Фраза (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

Правая часть продукции может указывать, что определенные развертывания не допускаются, используя фразу "but not" и затем указывая развертывания, которые должны быть исключены.

Например:

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