Глава 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.
Синтаксическая грамматика для языка программирования 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.
Фраза (one of) в правой части конструкции означает, что каждый из символов в следующей строке или строках является альтернативным определением.
Например, лексическая грамматика содержит конструкцию:
0 1 2 3 которая является всего лишь удобным сокращением для:
0 1 2 3 Когда альтернатива в конструкции выглядит как токен, она представляет собой последовательность символов, которые составляли бы такой токен.
Таким образом, конструкция:
true false является сокращением для:
t r u e f a l s e Правая часть конструкции может указывать, что определенные расширения не допускаются, используя фразу "but not" и затем указывая расширения, которые следует исключить.
Например:
Наконец, несколько нетерминалов определяются повествовательной фразой римским шрифтом, когда перечислить все альтернативы было бы непрактично.
Например:
© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.