Spec-Zone.ru › Java Language Specification 17

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

Оглавление

2.1. Контекстно-свободные грамматики
2.2. Лексическая грамматика
2.3. Синтаксическая грамматика
2.4. Запись грамматики

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

2.1. Контекстно-свободные грамматики

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

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

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

Лексическая грамматика для языка программирования Java приведена в §3 (Лексическая структура). Эта грамматика имеет в качестве терминальных символов символы набора Unicode. Она определяет набор правил вывода, начиная с символа цели Input (§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, 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 Keyword 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