Spec-Zone.ru › Java Language Specification 11

Глава 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 в конструкциях лексической и синтаксической грамматики, а также во всей этой спецификации, когда текст непосредственно ссылается на такой терминальный символ. Они должны появляться в программе точно так, как написано.

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

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

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] [Superclass] [Superinterfaces] 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