訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
文脈自由な文法は、プロダクション(生成物)の番号で構成されます。 各プロダクションは、その左側にくるものとして非終端、ゼロ以上の非終端の並び(シーケンス)、その右側にくるものとして終端記号の並び(シーケンス)を呼ぶ抽象的な記号を持ちます。 各文法において終端記号は、指定したアルファベットで描かれます。 識別した非終端1つから成る文章の開始は、目標記号と呼ばれ、言語を指定する任意の文脈自由な文法、すなわち、左側にある非終端におけるプロダクションの右側にある並びの中で何らかの非終端を繰り返し置換することによって得ることができる終端記号の利用可能な並び(おそらく無限大)のセットを与えられます。
ECMAScriptにおける語彙の文法については第7項で示されます。 この文法は、その終端記号文字(Unicodeコードユニット)を持ち、それは、第6項で定義した SourceCharacter におけるルールと一致します。 それは、目標記号 InputElementDiv や InputElementRegExp から始まるプロダクションの集合を定義し、そうした文字の並びが、どのように入力要素の並びに翻訳されるのかを説明します。 ホワイトスペースとコメントではない入力要素は、ECMAScriptにおける構文上の文法の為の終端記号を形成すると共にECMAScriptのトークン(字句)と呼ばれます。 これらのトークンは、ECMAScript言語の予約語、識別子、リテラル、句読点記号です。 更に行終端は、トークンとして考慮されるわけではありませんが、入力要素のストリームの一部にもなり、セミコロン自動挿入(7.9)の処理を導きます。 単純なホワイトスペースと単一行コメントは廃棄され、構文上の文法における入力要素のストリーム内には現れません。 MultiLineComment(一行以上に渡るか否かに関わらず、書式 /* ... */ のコメント)は、行終端がなければ、単に廃棄されたのと同様になりますが、 MultiLineCommentが、1つ以上の行終端を含む場合には、1つの行終端に置き換えられ、構文上の文法における入力要素のストリームの一部となります。 ECMAScriptにおけるRegExp文法については、15.10 の中で示されます。 この文法もまた、SourceCharacterによって定義されたのと同じ文字をその終端記号として持ちます。 目標記号 Pattern から始まるプロダクションの集合を定義し、文字の並びが、どのようにして正規表現パターンに翻訳されるかを説明します。 語彙とRegExp文法から成るプロダクションは、分割する句読点(セパレータ)として2つのコロン"::"を持つことによって識別されます。 語彙とRegExp文法は、複数のプロダクションを共有します。
その他の文法は、文字を数値に翻訳する為に利用されます。 この文法は、数値リテラルを伴って実行する為に持っている語彙文法の一部に似ており、その終端記号 SourceCharacter と同じものを持ちます。 この文法については、9.3.1 に出てきます。 数値文字列の文法のプロダクションは、句読点として3つのコロン":::"を持つことによって識別されます。
ECMAScriptにおける構文上の文法は、第11項、12項、13項、14項で示されます。 この文法は、その終端記号(5.1.2)として語彙的な文法によって定義したECMAScriptのトークン(字句)を持ちます。 目標記号 Program から始まるプロダクションの集合を定義し、どのようにしてトークンの並び(シーケンス)が、構文的に正しいECMAScriptプログラムを形成することができるのかを説明します。 文字のストリームが、ECMAScriptプログラムとして解析される為にある場合、それは、まず、繰り返した語彙的な文法のアプリケーションによって入力要素のストリームに変換され、その入力要素のストリームは、その後、任意の1つの構文上の文法のアプリケーションによって解析されます。 入力要素のストリーム内にあるトークンが、トークンが何もない目標非終端 Program の任意の1つのインスタンスとして解析できない場合、そのプログラムは、エラー内においては構文に沿っているといえます。 構文上の文法のプロダクションは、句読点としてまさに1つのコロン":"を持つことによって識別されます。 第11項、12項、13項、14項で提示されているように構文上の文法は、実際には正しいECMAScriptプログラムとして許容されるトークンのシーケンス(字句の並び)の完全な説明(account)ではありません。 特定の追加の字句の並び、すなわち、(行終端文字の前の位置のように)確実な場所にあるシーケンス(並び)に追加された場合に限り、文法によって説明されるであろう字句の並びもまた、許容されます。 更にその文法によって説明される特定の字句の並びは、終端文字が、特定の「厄介な」場所などに現れる場合には、受け入れを考慮されません。
JSONの文法は、実際のオブジェクトにECMAScriptのオブジェクトの集合を定義している任意の文字列を翻訳する為に利用されます。 JSONの文法は、15.12.1 に書かれています。 JSONの文法は、JSONの語彙的な文法と構文的な文法で構成されています。 JSONの語彙的な文法は、文字列をトークンに翻訳する為に利用され、それは、ECMAScriptの語彙的な文法の一部に似ています。 JSONの構文的な文法は、構文的に正しいJSONオブジェクト定義からどのようにJSONの語彙的な文法から成るトークンのシーケンスができるのかを定義します。 JSONの語彙的な文法から成るプロダクションは、分割句読点として2つのコロン"::"を持つことによって識別されます。 JSONの構文的な文法は、ECMAScriptの語彙的な文法から成る何らかのプロダクションを利用します。 JSONの構文的な文法は、ECMAScriptの構文的な文法の一部に似ています。 JSONの構文的な文法から成るプロダクションは、分割する句読点として1つのコロン":"を使用することによって識別されます。
語彙的な終端記号、RegExpの終端記号、数値文字の文法の終端記号、他の文法から成る終端記号の一部は、文法のプロダクションとそのような終端記号をテキストが直接参照するか否かについてのこの仕様を通して、その両方において固定幅フォントで表示されます。 これらは、書いた通りに正確にプログラム内に現れるようにする為にあります。 この方法で指定した全ての終端記号文字は、ASCIIの範囲から成る適切なUnicode文字であり、他のUnicode文字から成る似たような見た目の文字とは異なるものであると理解される為にあります。 非終端記号はイタリック体で表示されます。 (webzoit.net内訳文においては、これを踏襲しない可能性があります。) 非終端の定義は1つ以上のコロンに続けて定義される非終端から成る名称によって始まります。 (コロンの数は、属する文法のプロダクションによって示されます。) 非終端について右辺に1つ以上の選択肢がある場合は、後続する行に続きます。 例えば、構文上の定義、
WhileStatement: while ( Expression ) Statement
という非終端の WhileStatement という状態(state)は、トークン(字句) while 、トークン(字句) 左丸カッコ、Expression(式) 、トークン(字句) 右丸カッコ、Statement(文)が続くことを表します。 Expression (式)とStatement (文)の出現は、それら自身は、非終端となります。 他で例えるなら、構文上の定義、
ArgumentList: AssignmentExpression ArgumentList , ArgumentExpression
は、 ArgumentList が、単一の AssignmentExpression か、または、カンマに続けて、 AssignmentExpression が続く何れか1つの状態を表す場合があります。 この ArgumentList の定義は、再帰的で、つまり、それ自身についての観点の中で定義されます。 その結果は、各引数の式が、 ArgumentExpression である場合、 ArgumentList が、カンマ区切りの正の数の引数を含む場合があるということです。 このような非終端の再帰定義は、一般的です。 添字の接尾辞"opt"が、終端や非終端の後に現れる場合、それはオプション記号を示します。 実際には、右辺に2つ指定するオプション記号を含む選択肢は、1つは省略可能なオプション要素、1つはそれ(省略したもの)を含みます。 この意味は、
VariableDeclaration: Identifier Initialiseropt
は、
VariableDeclaration: Identifier Identifier Initialiser
の便利な略記であり、
そしてまた、
IterationStatement: for ( ExpressionNoInopt ; Expressionopt ; Expressionopt ) Statement
は、
IterationStatement: for ( ; Expressionopt ; Expressionopt ) Statement for ( ExpressionNoIn ; Expressionopt ; Expressionopt ) Statement
の便利な省略形であり、それは、反復ステートメント
IterationStatement: for ( ; ; Expressionopt ) Statement for ( ; Expression ; Expressionopt ) Statement for ( ExpressionNoIn ; ; Expressionopt ) Statement for ( ExpressionNoIn ; Expression ; Expressionopt ) Statement
の省略形であり、それは、
IterationStatement: for ( ; ; ) Statement for ( ; ; Expression ) Statement for ( ; Expression ; ) Statement for ( ; Expression ; Expression ) Statement for ( ExpressionNoIn ; ; ) Statement for ( ExpressionNoIn ; ; Expression ) Statement for ( ExpressionNoIn ; Expression ; ) Statement for ( ExpressionNoIn ; Expression ; Expression ) Statement
の省略形なので、その非終端反復ステートメントは、実際には、右辺に8つの選択肢を持つということになります。 文法定義内でコロンに続く「下記の内の1つ」(、または、パターンのバリエーションを列挙後に「の内の1つ」)という単語がある場合、それらは、単一または複数行続く終端記号のそれぞれが、選択肢の定義であることを意味します。 例えば、プロダクションを含むECMAScriptにおけるその語彙的な文法は、
NonZeroDigit::下記の内の1つ 1 2 3 4 5 6 7 8 9
これは、
NonZeroDigit:: 1 2 3 4 5 6 7 8 9
における単に便利な省略形ですが、もし、[empty(カラ)]というフレーズがプロダクションの右辺として表れた場合、それは、プロダクションの右辺が、終端や非終端を何も含まないということを示しています。 もし、
"[lookahead ? set]" (lookahead:前方参照設定/?は、∈の否定形/set)
というフレーズがプロダクションの右辺として現れる場合、それは、直後に続く入力トークンが与えられた set をメンバとする場合、そのプロダクションが、使用されない場合があるということを示します。 その set は、波カッコで括られた終端のリストとして書かれることが可能です。 利便性において、その set は、非終端が拡張可能な場合に全ての終端の集合を提示する場合においては、非終端として書かれることも可能です。 例えば、与えられる定義
DecimalDigit::下記の内の1つ 0 1 2 3 4 5 6 7 8 9
DecimalDigits :: DecimalDigit DecimalDigits DecimalDigit
その定義
LookaheadExample:: n [lookahead ? {1, 3, 5, 7, 9}] DecimalDigits DecimalDigit [lookahead ? DecimalDigit] (lookahead:前方参照設定/?は、∈の否定形)
は、偶数で始まる1つ以上の10進数値が続く文字 n 、または、その他の10進数値が続かない文字 n の何れかとマッチします。 もし、そのフレーズ"[no LineTerminator here(ここに行終端はない)]"が構文上の文法のプロダクションの右辺に現れる場合、それは、そのプロダクションが、制限付きプロダクションであるということを示し、それは、LineTerminator(行終端)が示した位置にある入力ストリーム内に現れる場合、使用されない可能性があるということです。 例えば、そのプロダクション
ThrowStatement: throw [ここにLineTerminatorはない] Expression ;
は、仮にLineTerminator(行終端)が、プログラム上のトークン throw と Expression の間に現れる場合、そのプロダクションが使用されない可能性があるということを示しています。 LineTerminator(行終端)の存在が、制限付きのプロダクションによって禁じられる場合以外は、LineTerminator(行終端)の出現数が、そのプログラムの構文上の受容性に影響を与えることなく、入力要素のストリーム内で2つの連続したトークンの間に現れる場合があります。 語彙的な文法または数値文字の文法から成るプロダクション内の選択肢が複数文字のトークンとして現れる場合、それは、そのようなトークンを作りだすであろう文字の並びを表します。 任意のプロダクションの右辺は、そのフレーズ"but not(...ではなく、)"を使用することによって許可されない特定の拡張を指定する場合があり、その場合には、その拡張が除外されることを示します。 例えば、そのプロダクション
Identifier :: ReservedWord ではない IdentifierName
は、その非終端 Identifier は、ReservedWord と同一の文字の並びは、置き換えることができませんが、それ以外から成る任意の文字の並び IdentifierName によって置き換えられるという意味です。 (下線部の原文、読解不能の為、意訳) 最後にいくつかの非終端記号は、選択肢全てを列挙することが実用的でない(非現実的である)場合においては、(フォント)タイプ sans-serif での説明フレーズによって説明されます。(webzoit.net内訳文においては、これを踏襲しない可能性があります。)
SourceCharacter :: any Unicode code unit (何らかのUnicodeコードユニット)