Глава 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 в продукциях лексических и синтаксических грамматик и во всей этой спецификации, когда текст напрямую относится к такому терминальному символу. Они должны появляться в программе точно так, как они написаны.
Нетерминальные символы отображаются курсивом italic. Определение нетерминала начинается с имени определяемого нетерминала, за которым следует двоеточие. Затем на последующих строках следует одно или несколько альтернативных определений для нетерминала.
Например, синтаксическая продукция:
if ( Expression ) Statement указывает, что нетерминал IfThenStatement представляет собой токен if, за которым следует токен левой скобки, за которым следует Expression, за которым следует токен правой скобки, за которым следует Statement.
Синтаксис {x} в правой части продукции обозначает ноль или более вхождений x.
Например, синтаксическая продукция:
указывает, что ArgumentList состоит из Argument, за которым следует ноль или более вхождений запятой и Argument. В результате ArgumentList может содержать любое положительное количество аргументов.
Синтаксис [x] в правой части продукции обозначает ноль или одно вхождение x. То есть, x — это optional symbol. Альтернатива, которая содержит необязательный символ, на самом деле определяет две альтернативы: одну, которая опускает необязательный символ, и одну, которая включает его.
Это означает, что:
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.