本頁の目次 目次 次頁: 6_Source_Text 前頁: 4_Overview
このセクションでは、この仕様で ECMAScript プログラムの字句構文構造の定義に用いられる文脈自由文法 (context-free grammers) について述べる。
文脈自由文法はたくさんの生成規則 (production) によって構成される。各生成規則はその左辺に非終端記号 (nonterminal symbol) と呼ばれる抽象的記号を持ち、右辺に 0 個以上の非終端記号と終端記号 (terminal symbol) の並びを持つ。各文法のために、終端記号は特定のアルファベットか引き出される。
目標記号 (goal symbol) と呼ばれる、単一の識別される非終端記号で構成される文から始まり、与えられる文脈自由文法は言語を規定する。すなわち、終端記号の可能なシーケンスの (おそらく無限の) 集合で、それはシーケンス内で非終端記号を、非終端記号が左辺である生成規則の右辺で繰り返し置換することから生じる。
ECMAScript の字句文法はセクション 7 に与えられる。この文法は終端記号として Unicode 文字セットの文字をもつ。目標記号 InputElementDiv や InputElementRegExp から始まる生成規則のセットを定義し、これは Unicode 文字のシーケンスが入力要素のシーケンス内にどのように翻訳されるかを説明する。
空白類及びコメント以外の入力要素は、 ECMAScript トークン (ECMAScript tokens) と呼ばれ、 ECMAScript の構文的文法に終端記号を形成する。これらのトークンは ECMAScript 言語の予約語、識別子、リテラルおよび接続子である。さらに、行終端子 (line terminator) はトークンだと考えられてはいないが、入力要素のストリームの一部になり、自動セミコロン挿入 (セクション7.9) のプロセスをガイドする。
単純な空白類および一行のコメントは、廃棄されて構文的な文法用の入力要素のストリームに出現しない。MultiLineComment (1 行を超えるか範囲かどうか関係ない "/*…*/" 形式のコメント) が行終端子を含まない場合、同様に単に廃棄される; しかし、MultiLineComment が 1 つ以上の行終端子を含んでいる場合、それは 1 つの行終端子と置換され、それは構文的な文法用の入力要素のストリームの一部になる。
ECMAScript のための RegExp 文法はセクション 15.10 に与えられる。この文法は、さらにその終端記号として Unicode 文字セットの文字を持つ。それは 1 セットの生成規則を定義し、目標記号パターンから開始して、 Unicode 文字のシーケンスが正規表現パターンにどのように翻訳されるか説明する。
字句と RegExp 文法の生成規則は、区切り分離として 2 つのコロン "::" を持つことで識別される。字句と RegExp 文法はいくつかの生成規則を共有する。
第二の文法は文字列をを数値の値に変換するのに使用される。この文法は、数値リテラルと関係する字句の文法の一部に似ていて、その終端記号として Unicode 文字集合の文字を持つ。この文法はセクション 9.3.1 に出現する。
数値的文字文法の生成規則は、接続子として 3 つのコロン ":::" を用いて区別される。
ECMAScript のための構文的文法は、セクション 11, 12, 13, 14 の中で与えられる。この文法は ECMAScript トークンを持ち、字句文法によってその終端記号 (セクション 5.1.2) として定義される。それは生成規則の一集合を定義し、目標記号 Program から開始し、トークンのシーケンスがどのように構文上正しい ECMAScript プログラムを形成できるか説明する。
Unicode 文字のストリームが ECMAScript プログラムとして解析されることになっている場合、それは字句文法の繰り返された適用によって、最初に入力要素のストリームに変換される; この入力要素のストリームはその後、構文文法の単一のアプリケーションによって解析される。残ったトークンのない、ゴール非終端記号Program の単一の実例として入力要素のストリームのトークンを解析できない場合、プログラムは構文上誤っている。
構文的文法の生成規則は、接続子として 1 つのコロン ":" を用いて区別される。
セクション 11, 12, 13, 14 の中で示される構文的文法は、トークンシーケンスが正しい ECMAScript プログラムとして認められる、現実に完全な説明ではない。疑う余地のない追加トークンシーケンス、すなわち、文法によって記述され、セミコロンだけが (行終端子文字の前のような) 確実な場所内のシーケンスに加えられた場合も受理される。更に、終端子文字が確実に "不適当な" 場所に現われる場合、文法によって記述されるあるトークンシーケンスは、受理可能であるとは考えられない。
字句と文字列の文法の終端記号といくつかの構文文法の終端記号は、文法の生成規則内及びこの仕様を通して、テキストがそのような終端記号を直接参照するときは 等幅フォントであらわされる。これらはプログラム中に書かれるものとして出現する。この方法で指定される非終端記号の文字は全て、 ASCII の範囲から 適当な Unicode 文字として理解されるものであり、他の Unicode 範囲の類似した文字ではない。
非終端記号は イタリック体 であらわされる。非終端記号の定義は、一つ以上のコロンの続く定義されている非終端記号の名前によって案内される。(コロンの数は生成規則がどの文法に属するかを示す。) 非終端記号の一つ以上の代替の右辺は後続行に続く。
[訳注: この HTML 版邦訳でのフォントはこの限りではないかもしれない。]
例えば、次の構文定義:
with
( Expression ) Statementは、非終端記号 WithStatement がトークン
、左括弧トークン、 Expression 、右括弧トークン、 Statement の続きをあらわすことを明言する。 Expression 及び Statement の出現はそれ自身非終端である。別な例として、次の構文定義:with
は、 ArgumentList が単一の AssignmentExpression 、または ArgumentList 、カンマ、 AssignmentExpression の続きのどちらかをあらわすかもしれないことを明言する。この ArgumentList の定義は再帰的で、つまり、自分自身の表現の中で定義される。結果として、 ArgumentList はカンマで区切られた任意の正数の引数で構成されうる。その各引数式のところは AssignmentExpression である。非終端記号のそのような再帰的定義が一般的である。
下付き文字による後置句 "opt" は、終端記号または非終端記号の後に出現でき、選択的記号を示す。代替構成の選択的記号は実際は 2 つの右辺を規定する。1 つは選択的要素を省いたもの、1 つは含めたものである。これはつまり:
は次の略記であるということだ:
そして:
for
( ExpressionNoInopt ; Expressionopt ; Expressionopt ) Statementは次の略記であり:
for
( ; Expressionopt ; Expressionopt ) Statementfor
( ExpressionNoIn ; Expressionopt ; Expressionopt ) Statement順に次の略記ということになり:
for
( ; ; Expressionopt ) Statementfor
( ; Expression ; Expressionopt ) Statementfor
( ExpressionNoIn ; ; Expressionopt ) Statementfor
( ExpressionNoIn ; Expression ; Expressionopt ) Statement順に次の略記ということになる:
for
( ; ; ) Statementfor
( ; ; Expression ) Statementfor
( ; Expression ; ) Statementfor
( ; Expression ; Expression ) Statementfor
( ExpressionNoIn ; ; ) Statementfor
( ExpressionNoIn ; ; Expression ) Statementfor
( ExpressionNoIn ; Expression ; ) Statementfor
( ExpressionNoIn ; Expression ; Expression ) Statement従って非終端記号 IterationStatement は、実際には 8 個の代替右辺を持つ。
フレーズ "[empty]" が生成規則の右辺に出現するならば、それは生成規則の右辺が終端記号も非終端記号も含まないことを示す。
フレーズ "[lookahead ∉ set]" が生成規則の右辺に出現する場合は、直後の入力終端記号が与えられた set の元ならば、生成規則が使われないことを示す。 set は { } 内に囲まれた終端記号のリストとして書くことが出来る。簡潔に言えば、 set は非終端記号として書くことも出来る。その場合、非終端記号から展開可能な終端記号の全てをあらわす。例えば、定義
を与えられて、定義
は、偶数で始まる一つ以上の数字が続く文字 n 、あるいは他の数字が続かない数字にマッチする。
フレーズ "[no LineTerminator here]" 構文的文法の生成規則の右辺に出現する場合、生成規則が 制限生成規則 (restricted production) であることを示す: 入力ストリームの示された位置に LineTerminator が出現しなければ使用できない。例えば、次の生成規則:
return
[LineTerminator 無し] Expressionopt ;プログラム内の
トークンと Expression の間に LineTerminator が出現する場合はこの生成規則は使用できない。return
LineTerminator の存在が制限生成規則に隠されなければ、入力要素のストリーム内の 2 つの連続するトークン間に LineTerminator はいくつでも出現でき、プログラムの構文的受容性に影響を与えない。
文法定義内のコロンに語句 "one of" が続く場合、後続行の終端記号のそれぞれが代替定義であることを意味する。例えば、ECMAScript の字句文法は次の生成規則を含む:
これは単に次の略記である:
字句文法また数値文字文法の生成規則内の代替が複数文字トークンである場合、そのトークンを作る文字シーケンスをあらわす。
生成規則の右辺は、フレーズ "but not" を用いてある展開が許可されないことを規定してよく、その展開は除外される。例えば、次の生成規則:
は、非終端記号 Identifier が IdentifierName に置換可能だが ReservedWord で置換不可能な文字シーケンスであることを意味する。
最後に、全ての代替をすべてあげるのが現実的でないいくつかの非終端記号が、ローマン体の説明的フレーズで記述される:
仕様はしばしば番号を振ったリストを用いて、アルゴリズム内のステップを規定する。これらのアルゴリズムは意味論を明確にするために用いられる。実際には、与えられる機能の実装に有効な、より能率的なアルゴリズムであってよい。
アルゴリズムが結果として値を生成するとき "x を返す" が用いられ、アルゴリズムの結果が x の値であり、アルゴリズムが終了すべきであることを示す。表記 Result(n) は "ステップ n の結果" の略記である。Type(x) は "x の型" の略記である。
本セクションで後に述べる加法、減法、否定、乗法、除法、数学的関数のような数学的操作は、常に、無限及び正の 0 から区別される負の 0 を含まない数学的な実数上の厳密な数学的結果を演算するものとして理解されるべきである。浮動小数点数計算を作るこの標準のアルゴリズムは、必要に応じて、無限と符号付きの 0 を操作し丸めの実行する、明示的なステップを含む。数学的操作または関数が浮動小数点数に適用される場合、その浮動小数点数\であらわされる厳密な数学的値に適用されるものとして理解されるべきである; そのような浮動小数点数は有限であるべきで、そして +0 または -0 ならば該当する数学的値は単に 0 である。
数学関数 abs(x) は x の絶対値をもたらし、 x が負(0 未満) なら -x 、そうでなければ x 自身である。
数学関数 sign(x) は、 x が正ならば 1、 x が負ならば -1 をもたらす。 x が 0 のときのための sign 関数はこの標準では用いられない。
記法 "x modulo y" (y は 0 以外の有限数) は、ある整数 q について abs(k) < abs(y) かつ x - k = q * y であるような、 y (又は 0) と同じ符号の値 k を算出する。
数学関数 floor(x) は x より大きくない最大の整数 (正の無限に接近する) をもたらす。
NOTE floor(x) = x - (x modulo 1).
アルゴリズムが "例外を投げる" と定義されていれば、アルゴリズムの実行は終了し、結果を何も返さない。アルゴリズム呼出しも終了し、 "例外が投げられたら…" のような用語を用いて、アルゴリズムのステップが明示的に例外を扱うに至る。一度そのようなアルゴリズムのステップに遭遇したらそれ以上例外の発生は考慮されない。