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