Глава 2. Грамматики
Оглавление
В этой главе описаны безконтекстные грамматики, используемые в данном спецификации для определения лексической и синтаксической структуры программы.
Безконтекстная грамматика состоит из ряда производных правил. Каждое производное правило имеет абстрактный символ, называемый нетерминалом, в качестве своего левого операнда, и последовательность одного или нескольких нетерминалов и терминалов в качестве своего правого операнда. Для каждой грамматики терминальные символы берутся из указанного алфавита.
Исходя из предложения, состоящего из единственного выделенного нетерминала, называемого символом цели, данная безконтекстная грамматика задает язык, а именно, множество возможных последовательностей терминальных символов, которые могут получиться в результате многократной замены любого нетерминала в последовательности правой частью производного правила, для которого этот нетерминал является левым операндом.
Лексическая грамматика для языка программирования Java приведена в §3 (Лексическая структура). В этой грамматике в качестве терминальных символов выступают символы набора символов Юникод. Она определяет набор производных правил, начиная с символа цели Вход (§3.5), которые описывают, как последовательности символов Юникод (§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 в продукциях лексических и синтаксических грамматик, а также во всей этой спецификации, когда текст напрямую ссылается на такой терминальный символ. Они должны появляться в программе точно так, как написано.
Нетерминальные символы отображаются курсивом 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.