第2章 グラマー

目次

2.1 コンテキストのない文法
2.2 字句文法
2.3 構文文法
2.4 文法表記法

この章では、プログラムの字句構造と構文構造を定義するために、この仕様で使用されるコンテキストのない文法について説明します。

2.1.  コンテキスト自由文法

コンテキストなしの文法は、多数のプロダクションで構成されます。 各プロダクションには、非ターミナルと呼ばれる抽象記号が左側として、1つ以上の非ターミナル記号とターミナル記号のシーケンスが右側としてあります。 文法ごとに、終端記号は指定されたアルファベットから描画されます。

ゴール記号と呼ばれる単一の識別された非終端文で構成される文から始めて、特定のコンテキストのない文法は言語、つまり、シーケンス内の任意の非終端を、非終端が左側である本番の右側と繰り返し置換することから生じる可能性のある一連の終端記号を指定します。

2.2.  字句文法

Javaプログラミング言語の字句は、§3 (字句構造)に記載されています。 この文法は、終端記号としてUnicode文字セットの文字を使用しています。 ゴールシンボル Input (§3.5)から始まる一連のプロダクションを定義し、Unicode文字のシーケンス(§3.1)を一連の入力要素(§3.2)に変換する方法を記述します。

空白(§3.6)およびコメント(§3.7)が破棄されたこれらの入力要素は、Javaプログラミング言語の構文文法用の端末記号を形成し、トークン(§3.5)と呼ばれます。 これらのトークンは、Javaプログラミング言語の識別子(§3.8)、キーワード(§3.9)、リテラル(§3.10)、セパレータ(§3.11)、および演算子(§3.12)です。

2.3.  構文文法

Javaプログラミング言語の構文文法は、第4章、6-10章、14章および15章に記載されています。 この文法には、終端記号として字句文法で定義されたトークンがあります。 これは、トークンのシーケンスが構文的に正しいプログラムを形成する方法を説明する、ゴールシンボル CompilationUnit (§7.3)から始まる一連のプロダクションを定義します。

便宜上、構文文法は第19章にまとめられています。

2.4.  文法の表記法

末端記号は、字句文法および構文文法のプロダクションではfixed widthフォントで表示され、テキストがこのような終端記号を直接参照している場合は常にこの仕様全体に表示されます。 これらは、記述されたとおりにプログラムに表示されます。

非終端記号は、イタリック型で表示されます。 非終端の定義は、定義される非終端の名前とコロンによって導入されます。 非終端の代替定義が1つ以上続きます。

たとえば、構文は次のように生成されます。

IfThenStatement:
if (式の)

ターミナル以外のIfThenStatementは、トークンif、左カッコ・トークン、、右カッコ・トークン、を表します。

本番環境の右側の構文 {x}は、ゼロ個以上の xを表します。

たとえば、構文は次のように生成されます。

ArgumentList:
引数{、 Argument}

ArgumentListは、Argumentで構成され、その後にカンマとArgumentが0個以上出現します。 その結果、ArgumentListには任意の正の数の引数を含めることができます。

本番環境の右側の構文 [x]は、ゼロまたは1回の xを表します。 つまり、xオプションの記号です。 オプションの記号を含む代替方法によって、実際には2つの選択肢が定義されます: オプションの記号とそれを含む記号を省略したもの。

これは、次のことを意味します。

BreakStatement:
break [識別子] ;

は、次の便利な略語です。

BreakStatement:
break ;
break識別子 ;

別の例として、次のようになります。

BasicForStatement:
for ( [ForInit] ; [Expression] ; [ForUpdate] )

は、次の便利な略語です。

BasicForStatement:
for ( ; [式] ; [ForUpdate] )
for ( ForInit ; [式] ; [ForUpdate] )

次に示すのは省略形です。

BasicForStatement:
for ( ; ; [ForUpdate] )
for ( ;; [ForUpdate] )
for ( ForInit ; ; [ForUpdate] )
for ( ForInit ;; [ForUpdate] )

次に示すのは省略形です。

BasicForStatement:
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には、実際には8つの代替右辺があります。

右側が非常に長い場合、2番目の行を明確にインデントすることで、2番目の行で継続できます。

たとえば、構文文法には次のプロダクションが含まれます。

非ターミナルNormalClassDeclarationの右側を1つ定義します。

生産の右側にあるフレーズ(one of)は、次の行または行の各記号が代替定義であることを示します。

たとえば、字句文法には生産が含まれています。

ZeroToThree:
(いずれか)
0 1 2 3

これは単に便利な略語です:

ZeroToThree:
0
1
2
3

本番の代替がトークンであるように見える場合、このようなトークンを構成する一連の文字を表します。

したがって、生産は次のようになります。

BooleanLiteral:
(いずれか)
true false

これは、次の式の短縮形です。

BooleanLiteral:
t r u e
f a l s e

本番の右側では、「しかし」というフレーズを使用し、除外する展開を示すことで、特定の展開が許可されないことを指定できます。

たとえば:

識別子:
IdentifierChars ではなく ReservedKeyword または BooleanLiteral または NullLiteral

最後に、いくつかの非端子は、ロマン型のナラティブフレーズによって定義され、すべての選択肢をリストすることは実用的ではありません。

たとえば:

RawInputCharacter:
UTF-16で表現可能な任意のUnicode文字