Spec-Zone .ru
спецификации, руководства, описания, API
|
ГЛАВА 2
Эта глава описывает бесконтекстные грамматики, используемые в этой спецификации, чтобы определить лексическую и синтаксическую структуру программы Java.
Запуск с предложения, состоящего из сингла, различал нетерминальный, названный целевым символом, данная бесконтекстная грамматика определяет язык, а именно, бесконечное множество возможных последовательностей терминальных символов, которые могут следовать из повторной замены любого нетерминального в последовательности с правой стороной производства, для которого нетерминальной является левая сторона.
Эти входные элементы, с пробелом (§3.6) и комментарии (§3.7) отброшенный, формируют терминальные символы для синтаксической грамматики для Java и вызываются маркерами Java (§3.5). Эти маркеры являются идентификаторами (§3.8), ключевые слова (§3.9), литералы (§3.10), разделители (§3.11), и операторы (§3.11) языка Java.
LALR (1) версия синтаксической грамматики представляется в Главе 19. Грамматика в теле этой спецификации очень подобна LALR (1) грамматика, но более читаема.
fixed
width
шрифт в производстве лексических и синтаксических грамматик, и всюду по этой спецификации всякий раз, когда текст непосредственно относится к такому терминальному символу. Они должны появиться в программе точно как записано. Нетерминальные символы показывают в курсиве. Определение нетерминального представляется именем нетерминального, определяемого сопровождаемый двоеточием. Одна или более альтернативных правых сторон для нетерминального тогда следуют последующие строки. Например, синтаксическое определение:
IfThenStatement:состояния, что нетерминальный IfThenStatement представляет маркер
if (
Expression)
Statement
if
, сопровождаемый маркером левой круглой скобки, сопровождаемым Выражением, сопровождаемым маркером правой круглой скобки, сопровождаемым Оператором. Как другой пример, синтаксическое определение: ArgumentList:состояния, что ArgumentList может представить или единственный Параметр или ArgumentList, сопровождаемый запятой, сопровождаемой Параметром. Это определение ArgumentList является рекурсивным, то есть это определяется с точки зрения себя. Результат состоит в том, что ArgumentList может содержать любое положительное число параметров. Такие рекурсивные определения нетерминалов распространены.
Argument
ArgumentList,
Argument
Преобразованный в нижний индекс суффикс "выбирает", который может появиться после терминального или нетерминального, указывает на дополнительный символ. Альтернатива, содержащая дополнительный символ фактически, определяет две правых стороны, тот, который опускает дополнительный элемент и тот, который включает это. Это означает что:
BreakStatement:удобное сокращение для:
break
Identifieropt;
BreakStatement:и это:
break ;
break
Identifier;
ForStatement:удобное сокращение для:
for (
ForInitopt;
Expressionopt;
ForUpdateopt)
Statement
ForStatement:который поочередно является сокращением для:
for ( ;
Expressionopt;
ForUpdateopt)
Statement
for (
ForInit;
Expressionopt;
ForUpdateopt)
Statement
ForStatement:который поочередно является сокращением для:
for ( ; ;
ForUpdateopt)
Statement
for ( ;
Expression;
ForUpdateopt)
Statement
for (
ForInit; ;
ForUpdateopt)
Statement
for (
ForInit;
Expression;
ForUpdateopt)
Statement
ForStatement:таким образом, у нетерминального ForStatement фактически есть восемь альтернативных правых сторон.
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
Очень длинная правая сторона может продолжаться на второй строке, существенно располагая эту вторую строку с отступом, как в:
ConstructorDeclaration:который определяет одну правую сторону для нетерминального ConstructorDeclaration. (Эта правая сторона является сокращением для четырех альтернативных правых сторон, из-за двух возникновений "выбирают".)
ConstructorModifiersoptConstructorDeclarator
ThrowsoptConstructorBody
Когда слова "один из" следуют за двоеточием в определении грамматики, они показывают, что каждый из терминальных символов на следующей строке или строках является альтернативным определением. Например, лексическая грамматика для Java содержит производство:
ZeroToThree: one ofкоторый является просто удобным сокращением для:
0 1 2 3
ZeroToThree:Когда альтернатива в лексическом производстве, кажется, маркер, она представляет последовательность символов, которые составили бы такой маркер. Таким образом, определение:
0
1
2
3
BooleanLiteral: one ofв лексической грамматике производство является сокращением для:
true false
BooleanLiteral:Правая сторона лексического производства может определить, что определенные расширения не разрешаются при использовании фразы, "но не" и затем указание на расширения, которые будут исключены, как в производстве для InputCharacter (§3.4) и Идентификатор (§3.8):
t r u e
f a l s e
InputCharacter:Наконец, несколько нетерминальных символов описываются дескриптивной фразой в римлянине, вводят случаи, где это было бы непрактично, чтобы перечислить все альтернативы:
UnicodeInputCharacter but not CR or LF Identifier:
IdentifierName but not a Keyword or BooleanLiteral or NullLiteral
RawInputCharacter:
any Unicode character
Содержание | Предыдущий | Следующий | Индекс
Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com