Глава 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.
Синтаксическая грамматика языка программирования Java приведена в главах 4, 6-10, 14 и 15. Эта грамматика имеет токены, определённые лексической грамматикой, в качестве терминальных символов. Она определяет множество производных правил, начиная с символа цели CompilationUnit (§7.3), которые описывают, как последовательности токенов могут образовывать синтаксически корректные программы.
Для удобства, синтаксическая грамматика представлена целиком в главе 19.
Терминальные символы отображаются шрифтом fixed width в правилах лексической и синтаксической грамматики, а также в этом документе, когда текст непосредственно ссылается на такой терминальный символ. Они должны отображаться в программе точно так, как написаны.
Нетерминальные символы отображаются шрифтом курсивом. Определение нетерминального символа начинается с имени определяемого нетерминального символа, за которым следует двоеточие. Далее следуют одно или несколько альтернативных определений для нетерминального символа на последующих строках.
Например, синтаксическое правило:
if ( Выражение ) Оператор указывает, что нетерминальный символ IfThenStatement представляет собой токен if, за которым следует токен левой круглой скобки, за которым следует Выражение, за которым следует токен правой круглой скобки, за которым следует Оператор.
Синтаксис {x} в правой части правила обозначает ноль или более вхождений x.
Например, синтаксическое правило:
указывает, что ArgumentList состоит из Argument, за которым следует ноль или более вхождений запятой и Argument. Результатом является то, что ArgumentList может содержать любое положительное число аргументов.
Синтаксис [x] в правой части правила обозначает ноль или одно вхождение x. То есть, x является необязательным символом. Альтернатива, содержащая необязательный символ, фактически определяет две альтернативы: одну, которая опускает необязательный символ, и одну, которая его включает.
Это означает, что:
break [Идентификатор] ;
является удобным сокращением для:
break ; break Идентификатор ; Как ещё один пример, это означает, что:
for ( [ForInit] ; [Выражение] ; [ForUpdate] ) Оператор является удобным сокращением для:
for ( ; [Выражение] ; [ForUpdate] ) Оператор for ( ForInit ; [Выражение] ; [ForUpdate] ) Оператор Очень длинная правая часть может быть продолжена на второй строке, четко отступая вторую строку.
Например, синтаксическая грамматика содержит это правило:
что определяет одну правую часть для нетерминального символа NormalClassDeclaration.
Фраза (один из) в правой части правила указывает, что каждый из терминальных символов в следующей строке или строках является альтернативным определением.
Например, лексическая грамматика содержит правило:
0 1 2 3 что является просто удобным сокращением для:
0 1 2 3 Когда альтернатива в правиле, кажется, представляет собой токен, она представляет собой последовательность символов, которые бы составляли такой токен.
и так далее...Правая часть правила может указать, что некоторые расширения запрещены, используя фразу "но не" и затем указывая расширения, которые нужно исключить.
Например:
Наконец, несколько нетерминальных символов определяются описательной фразой в обычном шрифте, где было бы непрактично перечислить все альтернативы.
Например:
© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.