0x0b
js_source&lexical
最終更新:
Bot(ページ名リンク)
-
view
ソーステキスト(Source Text)
ECMAScript ソーステキストは Unicode 文字符号化バージョン 2.1 以降の文字のシーケンスとして表わされ、 UTF-16 変形フォーマットを使用する。 Unicode 技術報告書 #15 に記述されるような Unicode 正規化形式 C (正統構成) へのテキストの正規化が期待される。適合 ECMAScript 実装には、テキストの正規化の実行も、実行しているかのような振る舞いも要求されない。
SourceCharacter ::
任意の Unicode文字
ECMAScriptソーステキストは、任意の Unicode 文字で構成できる。 Unicode 空白文字はすべて空白として扱われ、また Unicode 行/段落分離子はすべて行分離子として扱われる。非 Latin の Unicode 文字は、識別子、文字列リテラル、正規表現リテラルおよびコメントの中で許可される。
この文書の残り全体を通して、語句 "コードポイント" および単語 "文字" が使用され、 UTF-16 テキストの単一の 16 ビット単位をあらわすのに使われる符号なし 16 ビット値を参照する。語句 "Unicode 文字" は、単一の Unicode スカラー値 (それは16ビットより長くてもよく、このように 1 つ以上のコードポイントによって表わされてもよい) にあらわされる、抽象語的な、また印字可能な単位を参照する。これは、単一の Unicode スカラー値によって表わされる実体を参照するだけである: たとえユーザが全体のシーケンスを単一の文字と見なしてもよくても、結合する文字シーケンスの成分は依然として個々の "Unicode 文字" である。
文字列リテラル、正規表現リテラルおよび識別子では、任意の文字 (コードポイント) を 6 文字 (すなわち 4 桁の16進数と \u) から成る Unicode エスケープシーケンスとして表現してもよい。コメント内では、そのようなエスケープシーケンスは、コメントの一部として有効に無視される。文字列リテラルか正規表現リテラル内では、 Unicodeエスケープシーケンスがリテラルの値に 1 文字を寄付する。識別子内では、エスケープシーケンスが識別子に1文字を寄付する。
NOTE このドキュメントは "文字列" 内の "文字" と、その文字の UTF-16 符号化である符号なし16ビット整数の間の "変形" を時々参照するが、現実には符号なし16ビット値を用いて "文字列" 内の "文字" が表わされるので、実際には変形はない。
NOTE ECMAScriptは、 Unicode エスケープシーケンスの振る舞いにおいて Java プログラミング言語と異なる。 Java プログラム中で、 Unicode エスケープシーケンス \u000A が、例えば、一行のコメント内に出現する場合、それは行終端子 (Unicode 文字 000A はラインフィード) として解釈され、したがって、次の文字はコメントの一部にはならない。同様に、 Unicode エスケープシーケンス \u000A が、 Java プログラム中の文字列リテラル内に出現する場合、それは同様に文字列リテラルの内に許可されない行終端子として解釈される -- one は \u000A の代わりに \n と書いてラインフィードを文字列リテラルの文字列値の一部にしなければならない。ECMAScript プログラムでは、コメント内に生じる Unicode エスケープシーケンスが解釈されず、したがってコメントの終了に寄与することができない。同様に、 ECMAScript プログラム中の文字列リテラル内に生じる Unicode エスケープシーケンスは、常にリテラルの文字列値に文字を寄付し、行終端子、あるいは文字列のリテラルを終了する引用符としては解釈されない。
SourceCharacter ::
任意の Unicode文字
ECMAScriptソーステキストは、任意の Unicode 文字で構成できる。 Unicode 空白文字はすべて空白として扱われ、また Unicode 行/段落分離子はすべて行分離子として扱われる。非 Latin の Unicode 文字は、識別子、文字列リテラル、正規表現リテラルおよびコメントの中で許可される。
この文書の残り全体を通して、語句 "コードポイント" および単語 "文字" が使用され、 UTF-16 テキストの単一の 16 ビット単位をあらわすのに使われる符号なし 16 ビット値を参照する。語句 "Unicode 文字" は、単一の Unicode スカラー値 (それは16ビットより長くてもよく、このように 1 つ以上のコードポイントによって表わされてもよい) にあらわされる、抽象語的な、また印字可能な単位を参照する。これは、単一の Unicode スカラー値によって表わされる実体を参照するだけである: たとえユーザが全体のシーケンスを単一の文字と見なしてもよくても、結合する文字シーケンスの成分は依然として個々の "Unicode 文字" である。
文字列リテラル、正規表現リテラルおよび識別子では、任意の文字 (コードポイント) を 6 文字 (すなわち 4 桁の16進数と \u) から成る Unicode エスケープシーケンスとして表現してもよい。コメント内では、そのようなエスケープシーケンスは、コメントの一部として有効に無視される。文字列リテラルか正規表現リテラル内では、 Unicodeエスケープシーケンスがリテラルの値に 1 文字を寄付する。識別子内では、エスケープシーケンスが識別子に1文字を寄付する。
NOTE このドキュメントは "文字列" 内の "文字" と、その文字の UTF-16 符号化である符号なし16ビット整数の間の "変形" を時々参照するが、現実には符号なし16ビット値を用いて "文字列" 内の "文字" が表わされるので、実際には変形はない。
NOTE ECMAScriptは、 Unicode エスケープシーケンスの振る舞いにおいて Java プログラミング言語と異なる。 Java プログラム中で、 Unicode エスケープシーケンス \u000A が、例えば、一行のコメント内に出現する場合、それは行終端子 (Unicode 文字 000A はラインフィード) として解釈され、したがって、次の文字はコメントの一部にはならない。同様に、 Unicode エスケープシーケンス \u000A が、 Java プログラム中の文字列リテラル内に出現する場合、それは同様に文字列リテラルの内に許可されない行終端子として解釈される -- one は \u000A の代わりに \n と書いてラインフィードを文字列リテラルの文字列値の一部にしなければならない。ECMAScript プログラムでは、コメント内に生じる Unicode エスケープシーケンスが解釈されず、したがってコメントの終了に寄与することができない。同様に、 ECMAScript プログラム中の文字列リテラル内に生じる Unicode エスケープシーケンスは、常にリテラルの文字列値に文字を寄付し、行終端子、あるいは文字列のリテラルを終了する引用符としては解釈されない。
字句について(Lexical Convension)
ECMAScript プログラムのソーステキストは最初に、トークン、行終端子、コメントあるいは空白のいずれかである入力要素のシーケンスに変換される。ソーステキストは、次の入力要素としてできるだけ長い文字シーケンスを繰り返しとって、左から右へと走査される。
字句文法には 2 つの目標記号がある。 InputElementDiv 記号は、除法演算子 (/) また除法代入演算子 (/=) が許される構文的文法コンテキストで使用される。 InputElementRegExp 記号は他の構文的文法コンテキストで使用される。
NOTE 構文的な文法内に、除算および RegularExpressionLiteral の両方が構文的文法によって許されるコンテキストが存在する; だが、そういう場合字句文法は InputElementDiv 目標記号を使用するので、そのコンテキスト中でスラッシュ開始は正規表現リテラル開始とは認められない。代替手段として、一つは括弧で正規表現リテラルを囲んでよい。
Syntax
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
Token
DivPunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
Token
RegularExpressionLiteral
字句文法には 2 つの目標記号がある。 InputElementDiv 記号は、除法演算子 (/) また除法代入演算子 (/=) が許される構文的文法コンテキストで使用される。 InputElementRegExp 記号は他の構文的文法コンテキストで使用される。
NOTE 構文的な文法内に、除算および RegularExpressionLiteral の両方が構文的文法によって許されるコンテキストが存在する; だが、そういう場合字句文法は InputElementDiv 目標記号を使用するので、そのコンテキスト中でスラッシュ開始は正規表現リテラル開始とは認められない。代替手段として、一つは括弧で正規表現リテラルを囲んでよい。
Syntax
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
Token
DivPunctuator
InputElementRegExp ::
WhiteSpace
LineTerminator
Comment
Token
RegularExpressionLiteral
Unicode 制御文字
フォーマット制御のための (マークアップ言語のような) 上位手順がないので、 Unicode 形式制御文字 (例: LEFT-TO-RIGHT MARK や RIGHT-TO-LEFT MARK のような、 Unicode 文字データベース (Unicode Character Database) における "Cf" カテゴリの文字) という制御コードでテキストの範囲のフォーマットを制御する。編集を容易にしまた表示するため、ソーステキスト内でのこれらの許可は有益である。
フォーマット制御文字は ECMAScript プログラムのソーステキストのどの場所に出現してもよい。これらの文字は、字句文法を適用する前にソーステキストから取り除かれる。文字列と正規表現リテラルの処理前にこれらの文字が取り除かれるので、文字列、正規表現内に Unicode 制御文字を入れるには Unicode エスケープシーケンス (字句について 識別子 (Identifiers)) を使用しなければならない。
フォーマット制御文字は ECMAScript プログラムのソーステキストのどの場所に出現してもよい。これらの文字は、字句文法を適用する前にソーステキストから取り除かれる。文字列と正規表現リテラルの処理前にこれらの文字が取り除かれるので、文字列、正規表現内に Unicode 制御文字を入れるには Unicode エスケープシーケンス (字句について 識別子 (Identifiers)) を使用しなければならない。
空白
空白文字は、ソーステキストの可読性を向上させ、そしてトークン (不可分の字句単位) を互いに分離させるために使用され、それ以上の意味はない。空白は 2 つのトークンの間、また文字列の中に出現できる(リテラル文字列値の一部を形成する意味のある文字と考えられる)。だが、トークンの中に出現することは出来ない。
次の文字が空白と考えられる:
次の文字が空白と考えられる:
Code Point Value | Name | Formal Name |
\u0009 | Tab | <TAB> |
\u000B | Vertical Tab | <VT> |
\u000C | Form Feed | <FF> |
\u0020 | Space | <SP> |
\u00A0 | No-break space | <NBSP> |
Other category "Zs" その他の Unicode "space separator" <USP>
Syntax
WhiteSpace ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<USP>
Syntax
WhiteSpace ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<USP>
行終端子 (Line Terminators)
空白文字のように、行終端子はソーステキストの可読性を向上させ、そしてトークン (不可分の字句単位) を互いに分離させるために使用される。しかし、空白文字とは違い、行終端子は構文的文法の振る舞いに影響を与える。一般に、行終端子は 2 のトークンの間に出現する。だが構文的文法によって隠される場所がある。行終端子はトークンの中に出現することは出来ない。 not even a string. 行終端子は自動セミコロン挿入の処理にも影響を与える (字句について 自動セミコロン挿入 )。
空白は 2 つのトークンの間、また文字列の中に出現できる(リテラル文字列値の一部を形成する意味のある文字と考えられる)。だが、トークンの中に出現することは出来ない。
次の文字が行終端子と考えられる:
空白は 2 つのトークンの間、また文字列の中に出現できる(リテラル文字列値の一部を形成する意味のある文字と考えられる)。だが、トークンの中に出現することは出来ない。
次の文字が行終端子と考えられる:
Code Point Value | Name | Formal Name |
\u000A | Line Feed | <LF> |
\u000D | Carriage Return | <CR> |
\u2028 | Line separator | <LS> |
\u2029 | Paragraph separator | <PS> |
Syntax
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
コメント (Comments)
Description
コメントは、 1 行または複数行になりうる。複数行のコメントはネストできない。
1 行コメントは LineTerminator 以外の任意の文字を含むことが可能であること、またトークンは常に可能な長さである一般規則により、 1 行コメントは常に、マーカー // からその行の終わりまでの全ての文字で構成される。しかし、行末の LineTerminator は 1 行コメントの内容とはみなされない; それは字句文法によって別々に認識され、構文文法の入力要素のストリームの一部となる。この点がとても重要である。というのは、これは 1 行コメントの有無が自動セミコロン挿入 (字句について 自動セミコロン挿入) に影響を与えないということを暗に意味するからである。
コメントは空白のように振る舞い、捨てられるが、 MultiLineComment が行終端子文字を含む場合、構文文法による解析を目的としてコメント全体が LineTerminator と考えられる、
Syntax
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
コメントは、 1 行または複数行になりうる。複数行のコメントはネストできない。
1 行コメントは LineTerminator 以外の任意の文字を含むことが可能であること、またトークンは常に可能な長さである一般規則により、 1 行コメントは常に、マーカー // からその行の終わりまでの全ての文字で構成される。しかし、行末の LineTerminator は 1 行コメントの内容とはみなされない; それは字句文法によって別々に認識され、構文文法の入力要素のストリームの一部となる。この点がとても重要である。というのは、これは 1 行コメントの有無が自動セミコロン挿入 (字句について 自動セミコロン挿入) に影響を与えないということを暗に意味するからである。
コメントは空白のように振る舞い、捨てられるが、 MultiLineComment が行終端子文字を含む場合、構文文法による解析を目的としてコメント全体が LineTerminator と考えられる、
Syntax
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
PostAsteriskCommentCharsopt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar ::
SourceCharacter but not asterisk *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not forward-slash / or asterisk *
SingleLineComment ::
SourceCharacter but not asterisk *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not forward-slash / or asterisk *
SingleLineComment ::
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
トークン (Tokens)
Syntax
Token ::
ReservedWord
Identifier
Punctuator
NumericLiteral
StringLiteral
Token ::
ReservedWord
Identifier
Punctuator
NumericLiteral
StringLiteral
予約語 (Reserved Words)
Description
予約語を識別子として使うことはできない。
Syntax
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
予約語を識別子として使うことはできない。
Syntax
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
キーワード (Keywords)
次のトークンは ECMAScript キーワードであり、 ECMAScript プログラム中で識別子に使うことはできない。
Syntax
Keyword :: one of
break
case
catch
continue
default
delete
do
else
finally
for
function
if
in
instanceof
new
return
switch
this
throw
try
typeof
var
void
while
with
Syntax
Keyword :: one of
break
case
catch
continue
default
delete
do
else
finally
for
function
if
in
instanceof
new
return
switch
this
throw
try
typeof
var
void
while
with
将来の予約語 (Future Reserved Words)
次の語は提出された拡張の中でキーワードとして使用され、その拡張が将来採択される可能性を考え、予約される。
Syntax
FutureReservedWord :: one of
abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile
Syntax
FutureReservedWord :: one of
abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile
識別子 (Identifiers)
Description
識別子は、若干の修正を加えた Unicode 標準 (バージョン 3.0 のセクション 5.16)で与えられる文法に従い解釈される。文法は Unicode 標準により指定される文字カテゴリの規範、及び参考情報の両方に基づいている。 Unicode 標準のバージョン 2.1 に指定されるカテゴリの文字は、全ての適合 ECMAScript 実装によってそれらのカテゴリ内として扱われなければならない; しかしながら、適合 ECMAScript 実装は、 Unicode の後のバージョンでのカテゴリ割り当てに基づく追加の合法的な識別子文字を許可してよい。
この標準は Unicode 標準に与えられる文法からある変更を指定する; ドル記号($) 及びアンダースコア (_) は識別子中のどこでも許される。ドル記号は機械的に生成されるコード中のみの使用を意図される。
Unicode エスケープシーケンスは識別子中でも許され、それは UnicodeEscapeSequence(文字列リテラル)の CV により算出されるように、識別子中のその場所に一文字を寄与する。 UnicodeEscapeSequence を使って識別子に不正な文字を設定することはできない。言い換えれば、\ UnicodeEscapeSequence シーケンスが UnicodeEscapeSequence の CV に置換されたら、結果は依然として有効な識別子で、正確に元の Identifier と文字の同じシーケンスなければならない。
Unicode 標準に従い規準的に等価である 2 つの識別子は、コードポイントの厳密に同じシーケンスによって表されない限りは等しくない(言い換えれば、適合 ECMAScript 実装は、識別子上でビット比較を行うことのみを要求される)。入ってくるソーステキストがコンパイラに行く前に正規化形式 C に変換されることを意図する。
Syntax
Identifier ::
ReservedWord でない IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeLetter
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
\ UnicodeEscapeSequence
UnicodeLetter
Unicode カテゴリ "Uppercase letter (Lu)", "Lowercase letter (Ll)", "Titlecase letter (Lt)", "Modifier letter (Lm)", "Other letter (Lo)", "Letter number (Nl)" 内の任意の文字
UnicodeCombiningMark
Unicode カテゴリ "Non-spacing mark (Mn)" または "Combining spacing mark (Mc)" 内の任意の文字
UnicodeDigit
Unicode カテゴリ "Decimal number (Nd)" 内の任意の文字
UnicodeConnectorPunctuation
Unicode カテゴリ "Connector punctuation (Pc)" 内の任意の文字
UnicodeEscapeSequence
セクション 7.8.4 を参照。
HexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
識別子は、若干の修正を加えた Unicode 標準 (バージョン 3.0 のセクション 5.16)で与えられる文法に従い解釈される。文法は Unicode 標準により指定される文字カテゴリの規範、及び参考情報の両方に基づいている。 Unicode 標準のバージョン 2.1 に指定されるカテゴリの文字は、全ての適合 ECMAScript 実装によってそれらのカテゴリ内として扱われなければならない; しかしながら、適合 ECMAScript 実装は、 Unicode の後のバージョンでのカテゴリ割り当てに基づく追加の合法的な識別子文字を許可してよい。
この標準は Unicode 標準に与えられる文法からある変更を指定する; ドル記号($) 及びアンダースコア (_) は識別子中のどこでも許される。ドル記号は機械的に生成されるコード中のみの使用を意図される。
Unicode エスケープシーケンスは識別子中でも許され、それは UnicodeEscapeSequence(文字列リテラル)の CV により算出されるように、識別子中のその場所に一文字を寄与する。 UnicodeEscapeSequence を使って識別子に不正な文字を設定することはできない。言い換えれば、\ UnicodeEscapeSequence シーケンスが UnicodeEscapeSequence の CV に置換されたら、結果は依然として有効な識別子で、正確に元の Identifier と文字の同じシーケンスなければならない。
Unicode 標準に従い規準的に等価である 2 つの識別子は、コードポイントの厳密に同じシーケンスによって表されない限りは等しくない(言い換えれば、適合 ECMAScript 実装は、識別子上でビット比較を行うことのみを要求される)。入ってくるソーステキストがコンパイラに行く前に正規化形式 C に変換されることを意図する。
Syntax
Identifier ::
ReservedWord でない IdentifierName
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeLetter
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
\ UnicodeEscapeSequence
UnicodeLetter
Unicode カテゴリ "Uppercase letter (Lu)", "Lowercase letter (Ll)", "Titlecase letter (Lt)", "Modifier letter (Lm)", "Other letter (Lo)", "Letter number (Nl)" 内の任意の文字
UnicodeCombiningMark
Unicode カテゴリ "Non-spacing mark (Mn)" または "Combining spacing mark (Mc)" 内の任意の文字
UnicodeDigit
Unicode カテゴリ "Decimal number (Nd)" 内の任意の文字
UnicodeConnectorPunctuation
Unicode カテゴリ "Connector punctuation (Pc)" 内の任意の文字
UnicodeEscapeSequence
セクション 7.8.4 を参照。
HexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
区切り子 (Punctuators)
Syntax
Punctuator :: one of
{ } ( ) [ ] . ; , < > <= >= == != === !== + - * % ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= <<= >>= >>>= &= |= ^=
DivPunctuator :: one of
/ /=
Punctuator :: one of
{ } ( ) [ ] . ; , < > <= >= == != === !== + - * % ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= <<= >>= >>>= &= |= ^=
DivPunctuator :: one of
/ /=
リテラル (Literals)
Syntax
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
Null リテラル (Null Literals)
Syntax
NullLiteral ::
null
Semantics
null リテラルの値 null は、単独の Null 型の値で null と呼ばれる。
NullLiteral ::
null
Semantics
null リテラルの値 null は、単独の Null 型の値で null と呼ばれる。
Boolean リテラル (Boolean Literals)
Syntax
BooleanLiteral ::
true
false
Semantics
Boolean リテラルの値 true は、 Boolean 型の値で true と呼ばれる。
Boolean リテラルの値 false は、Boolean 型の値で false と呼ばれる。
BooleanLiteral ::
true
false
Semantics
Boolean リテラルの値 true は、 Boolean 型の値で true と呼ばれる。
Boolean リテラルの値 false は、Boolean 型の値で false と呼ばれる。
数値リテラル (Numeric Literals)
Syntax
NumericLiteral ::
DecimalLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
NumericLiteral ::
DecimalLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
- DecimalDigits
- DecimalDigits
HexIntegerLiteral ::
0x HexDigit
0X HexDigit
HexIntegerLiteral HexDigit
NumericLiteral に直接続くソース文字は、けして IdentifierStart や DecimalDegit ではない。
NOTE 例えば:
3in
はエラーであり、 3 と in の 2 つの入力要素とはならない。
Semantics
数値リテラルは、 Number 型の値を表す。この値は 2 ステップで判断される: まず、数学値 (MV) がリテラルから派生する; 次に、この数学値が、下に述べるように丸められる。
NumericLiteral :: DecimalLiteral の数学値は、 DecimalLiteral の数学値である。
NumericLiteral :: HexIntegerLiteral の数学値は、 HexIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral . の数学値は、 DecimalIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 DecimalIntegerLiteral の数学値 + (DecimalDigits の数学値 × 10-n) である。
DecimalLiteral :: DecimalIntegerLiteral . ExponentPart の数学値は、 e を ExponentPart の数学値として DecimalIntegerLiteral の数学値 × 10e である。
DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits ExponentPart の数学値は、 n を DecimalDigit の文字数、 e を ExponenetPart の数学値として、 (DecimalIntegerLiteral の数学値 + (DecimalDigits の数学値 × 10-n)) × 10e である。
DecimalLiteral ::. DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 DecimalDigits の数学値 × 10-n である。
DecimalLiteral ::. DecimalDigits ExponentPart の数学値は、 n を DecimalDigits の文字数、 e を ExponenetPart の数学値として、 DecimalDigits の数学値の 10e-n である。
DecimalLiteral :: DecimalIntegerLiteral の数学値は、 DecimalIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral ExponentPart の数学値は、 e を ExponenetPart の数学値として、 DecimalIntegerLiteral の数学値 × 10e である。
DecimalIntegerLiteral :: 0 の数学値は、 0 である。
DecimalIntegerLiteral :: NonZeroDigit DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 (NonZeroDigit の数学値の × 10n) + DecimalDigits の数学値である。
DecimalDigits :: DecimalDigit の数学値は、 DecimalDigit の数学値である。
DecimalDigits :: DecimalDigits DecimalDigit の数学値は、 (DecimalDigits の数学値 × 10) + DecimalDigit の数学値である。
ExponentPart :: ExponentIndicator SignedInteger の数学値は、 SignedInteger の数学値である。
SignedInteger :: DecimalDigits の数学値は、 DecimalDigits の数学値である。
SignedInteger :: + DecimalDigits の数学値は、 DecimalDigits の数学値である。
SignedInteger :: - DecimalDigits の数学値は、負の DecimalDigits の数学値である。
DecimalDigit :: 0 または HexDigit :: 0 の数学値は、 0 である。
DecimalDigit :: 1 または NonZeroDigit :: 1 または HexDigit :: 1 の数学値は、 1 である。
DecimalDigit :: 2 または NonZeroDigit :: 2 または HexDigit :: 2 の数学値は、 2 である。
DecimalDigit :: 3 または NonZeroDigit :: 3 または HexDigit :: 3 の数学値は、 3 である。
DecimalDigit :: 4 または NonZeroDigit :: 4 または HexDigit :: 4 の数学値は、 4 である。
DecimalDigit :: 5 または NonZeroDigit :: 5 または HexDigit :: 5 の数学値は、 5 である。
DecimalDigit :: 6 または NonZeroDigit :: 6 または HexDigit :: 6 の数学値は、 6 である。
DecimalDigit :: 7 または NonZeroDigit :: 7 または HexDigit :: 7 の数学値は、 7 である。
DecimalDigit :: 8 または NonZeroDigit :: 8 または HexDigit :: 8 の数学値は、 8 である。
DecimalDigit :: 9 または NonZeroDigit :: 9 または HexDigit :: 9 の数学値は、 9 である。
HexDigit :: a または HexDigit :: A の数学値は、 10 である。
HexDigit :: b または HexDigit :: B の数学値は、 11 である。
HexDigit :: c または HexDigit :: C の数学値は、 12 である。
HexDigit :: d または HexDigit :: D の数学値は、 13 である。
HexDigit :: e または HexDigit :: E の数学値は、 14 である。
HexDigit :: f または HexDigit :: F の数学値は、 15 である。
HexIntegerLiteral :: 0x HexDigit の数学値は、 HexDigit の数学値である。
HexIntegerLiteral :: 0X HexDigit の数学値は、 HexDigit の数学値である。
HexIntegerLiteral :: HexIntegerLiteral HexDigit の数学値は、 (HexIntegerLiteral の数学値 × 16) + HexDigit の数学値である。
一旦数値リテラルの厳密な数学値が決定されたら、 Number 型の値に丸められる。数学値が 0 ならば、丸められる値は +0 である; そうではなく、リテラルが DecimalLiteral でなくそのリテラルが 20 を超える有効数字数\でなければ、数値が 20 番目以降の各有効数字を数字 0 へ置換して生成されるリテラルの数学値の数値、または 20 番目以降の各有効数字を数字 0 に置換して生成されるリテラルの数学値の数値、そして 20 番目の有効数字の位置のリテラルの増加、のいずれかでありえる場合、丸められる値は (
型 Number 型で定義される意味の) 数学値の数値でなければならない。数字はそれが ExponentPart の一部\でなく次の二点のどちらかであれば有効数字 (significant) である。
0 でない。
その左側が 0 以外の数字でその右側が 0 以外の数字で ExponentPart 内でない。
0x HexDigit
0X HexDigit
HexIntegerLiteral HexDigit
NumericLiteral に直接続くソース文字は、けして IdentifierStart や DecimalDegit ではない。
NOTE 例えば:
3in
はエラーであり、 3 と in の 2 つの入力要素とはならない。
Semantics
数値リテラルは、 Number 型の値を表す。この値は 2 ステップで判断される: まず、数学値 (MV) がリテラルから派生する; 次に、この数学値が、下に述べるように丸められる。
NumericLiteral :: DecimalLiteral の数学値は、 DecimalLiteral の数学値である。
NumericLiteral :: HexIntegerLiteral の数学値は、 HexIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral . の数学値は、 DecimalIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 DecimalIntegerLiteral の数学値 + (DecimalDigits の数学値 × 10-n) である。
DecimalLiteral :: DecimalIntegerLiteral . ExponentPart の数学値は、 e を ExponentPart の数学値として DecimalIntegerLiteral の数学値 × 10e である。
DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits ExponentPart の数学値は、 n を DecimalDigit の文字数、 e を ExponenetPart の数学値として、 (DecimalIntegerLiteral の数学値 + (DecimalDigits の数学値 × 10-n)) × 10e である。
DecimalLiteral ::. DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 DecimalDigits の数学値 × 10-n である。
DecimalLiteral ::. DecimalDigits ExponentPart の数学値は、 n を DecimalDigits の文字数、 e を ExponenetPart の数学値として、 DecimalDigits の数学値の 10e-n である。
DecimalLiteral :: DecimalIntegerLiteral の数学値は、 DecimalIntegerLiteral の数学値である。
DecimalLiteral :: DecimalIntegerLiteral ExponentPart の数学値は、 e を ExponenetPart の数学値として、 DecimalIntegerLiteral の数学値 × 10e である。
DecimalIntegerLiteral :: 0 の数学値は、 0 である。
DecimalIntegerLiteral :: NonZeroDigit DecimalDigits の数学値は、 n を DecimalDigits の文字数として、 (NonZeroDigit の数学値の × 10n) + DecimalDigits の数学値である。
DecimalDigits :: DecimalDigit の数学値は、 DecimalDigit の数学値である。
DecimalDigits :: DecimalDigits DecimalDigit の数学値は、 (DecimalDigits の数学値 × 10) + DecimalDigit の数学値である。
ExponentPart :: ExponentIndicator SignedInteger の数学値は、 SignedInteger の数学値である。
SignedInteger :: DecimalDigits の数学値は、 DecimalDigits の数学値である。
SignedInteger :: + DecimalDigits の数学値は、 DecimalDigits の数学値である。
SignedInteger :: - DecimalDigits の数学値は、負の DecimalDigits の数学値である。
DecimalDigit :: 0 または HexDigit :: 0 の数学値は、 0 である。
DecimalDigit :: 1 または NonZeroDigit :: 1 または HexDigit :: 1 の数学値は、 1 である。
DecimalDigit :: 2 または NonZeroDigit :: 2 または HexDigit :: 2 の数学値は、 2 である。
DecimalDigit :: 3 または NonZeroDigit :: 3 または HexDigit :: 3 の数学値は、 3 である。
DecimalDigit :: 4 または NonZeroDigit :: 4 または HexDigit :: 4 の数学値は、 4 である。
DecimalDigit :: 5 または NonZeroDigit :: 5 または HexDigit :: 5 の数学値は、 5 である。
DecimalDigit :: 6 または NonZeroDigit :: 6 または HexDigit :: 6 の数学値は、 6 である。
DecimalDigit :: 7 または NonZeroDigit :: 7 または HexDigit :: 7 の数学値は、 7 である。
DecimalDigit :: 8 または NonZeroDigit :: 8 または HexDigit :: 8 の数学値は、 8 である。
DecimalDigit :: 9 または NonZeroDigit :: 9 または HexDigit :: 9 の数学値は、 9 である。
HexDigit :: a または HexDigit :: A の数学値は、 10 である。
HexDigit :: b または HexDigit :: B の数学値は、 11 である。
HexDigit :: c または HexDigit :: C の数学値は、 12 である。
HexDigit :: d または HexDigit :: D の数学値は、 13 である。
HexDigit :: e または HexDigit :: E の数学値は、 14 である。
HexDigit :: f または HexDigit :: F の数学値は、 15 である。
HexIntegerLiteral :: 0x HexDigit の数学値は、 HexDigit の数学値である。
HexIntegerLiteral :: 0X HexDigit の数学値は、 HexDigit の数学値である。
HexIntegerLiteral :: HexIntegerLiteral HexDigit の数学値は、 (HexIntegerLiteral の数学値 × 16) + HexDigit の数学値である。
一旦数値リテラルの厳密な数学値が決定されたら、 Number 型の値に丸められる。数学値が 0 ならば、丸められる値は +0 である; そうではなく、リテラルが DecimalLiteral でなくそのリテラルが 20 を超える有効数字数\でなければ、数値が 20 番目以降の各有効数字を数字 0 へ置換して生成されるリテラルの数学値の数値、または 20 番目以降の各有効数字を数字 0 に置換して生成されるリテラルの数学値の数値、そして 20 番目の有効数字の位置のリテラルの増加、のいずれかでありえる場合、丸められる値は (
型 Number 型で定義される意味の) 数学値の数値でなければならない。数字はそれが ExponentPart の一部\でなく次の二点のどちらかであれば有効数字 (significant) である。
0 でない。
その左側が 0 以外の数字でその右側が 0 以外の数字で ExponentPart 内でない。
文字列リテラル (String Literals)
文字列リテラルは、単引用符または二重引用符で囲まれた 0 個以上の文字である。各文字はエスケープシーケンスによって表されてもよい。
Syntax
StringLiteral ::
" DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not double-quote " or backslash \ or LineTerminator
\ EscapeSequence
SingleStringCharacter ::
SourceCharacter but not single-quote ' or backslash \ or LineTerminator
\ EscapeSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u HexDigit HexDigit HexDigit HexDigit
非終端記号 HexDigit の定義は、(字句について 数値リテラル) に与える。 SourceCharacter はセクション 2 及び 6 で述べる。
文字列リテラルは String 型の値を表す。リテラルの文字列値 (SV) は、文字列値の様々な部分に寄与する文字値 (CV) に関して記述される。この処理の一部として、文字列リテラル内部のいくつかの文字は、(字句について 数値リテラル) に述べる数学値 (MV) を持つものとして解釈される。
StringLiteral :: "" の文字列値は、空の文字シーケンスである。
StringLiteral :: '' の文字列値は、空の文字シーケンスである。
StringLiteral :: " DoubleStringCharacters " の文字列値は、DoubleStringCharacters の文字列値である。
StringLiteral :: ' SingleStringCharacters ' の文字列値は、SingleStringCharacters の文字列値である。
DoubleStringCharacters :: DoubleStringCharacter の文字列値は、1 文字のシーケンスで、 DoubleStringCharacter の文字値である。
DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacters の文字列値は、順に DoubleStringCharacters の文字列値内の全ての文字の続く DoubleStringCharacter の文字値のシーケンスである。
SingleStringCharacters :: SingleStringCharacter の文字列値は、1 文字のシーケンスで、 SingleStringCharacter の文字値である。
SingleStringCharacters :: SingleStringCharacter SingleStringCharacters の文字列値は、順に SingleStringCharacters の文字列値内の全ての文字の続く SingleStringCharacter の文字値のシーケンスである。
DoubleStringCharacter :: SourceCharacter but not 二重引用符 " or バックスラッシュ \ or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
DoubleStringCharacter :: \ EscapeSequence の文字値は、 EscapeSequence の文字値である。
SingleStringCharacter :: SourceCharacter but not 単引用符 ' or バッククラッシュ \ or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
SingleStringCharacter :: \ EscapeSequence の文字値は、 EscapeSequence の文字値である。
EscapeSequence :: CharacterEscapeSequence の文字値は、 CharacterEscapeSequence の文字値である。
EscapeSequence :: 0 [lookahead ∉ DecimalDigit] の文字値は、 <NUL> 文字 (Unicode 値 0000) である。
EscapeSequence :: HexEscapeSequence の文字値は、 HexEscapeSequence の文字値である。
EscapeSequence :: UnicodeEscapeSequence の文字値は、 UnicodeEscapeSequence の文字値である。
CharacterEscapeSequence :: SingleEscapeCharacter の文字値は、次の表に従い SingleEscapeCharacter に決定されるコードポイント値の文字である:
Syntax
StringLiteral ::
" DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not double-quote " or backslash \ or LineTerminator
\ EscapeSequence
SingleStringCharacter ::
SourceCharacter but not single-quote ' or backslash \ or LineTerminator
\ EscapeSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u HexDigit HexDigit HexDigit HexDigit
非終端記号 HexDigit の定義は、(字句について 数値リテラル) に与える。 SourceCharacter はセクション 2 及び 6 で述べる。
文字列リテラルは String 型の値を表す。リテラルの文字列値 (SV) は、文字列値の様々な部分に寄与する文字値 (CV) に関して記述される。この処理の一部として、文字列リテラル内部のいくつかの文字は、(字句について 数値リテラル) に述べる数学値 (MV) を持つものとして解釈される。
StringLiteral :: "" の文字列値は、空の文字シーケンスである。
StringLiteral :: '' の文字列値は、空の文字シーケンスである。
StringLiteral :: " DoubleStringCharacters " の文字列値は、DoubleStringCharacters の文字列値である。
StringLiteral :: ' SingleStringCharacters ' の文字列値は、SingleStringCharacters の文字列値である。
DoubleStringCharacters :: DoubleStringCharacter の文字列値は、1 文字のシーケンスで、 DoubleStringCharacter の文字値である。
DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacters の文字列値は、順に DoubleStringCharacters の文字列値内の全ての文字の続く DoubleStringCharacter の文字値のシーケンスである。
SingleStringCharacters :: SingleStringCharacter の文字列値は、1 文字のシーケンスで、 SingleStringCharacter の文字値である。
SingleStringCharacters :: SingleStringCharacter SingleStringCharacters の文字列値は、順に SingleStringCharacters の文字列値内の全ての文字の続く SingleStringCharacter の文字値のシーケンスである。
DoubleStringCharacter :: SourceCharacter but not 二重引用符 " or バックスラッシュ \ or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
DoubleStringCharacter :: \ EscapeSequence の文字値は、 EscapeSequence の文字値である。
SingleStringCharacter :: SourceCharacter but not 単引用符 ' or バッククラッシュ \ or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
SingleStringCharacter :: \ EscapeSequence の文字値は、 EscapeSequence の文字値である。
EscapeSequence :: CharacterEscapeSequence の文字値は、 CharacterEscapeSequence の文字値である。
EscapeSequence :: 0 [lookahead ∉ DecimalDigit] の文字値は、 <NUL> 文字 (Unicode 値 0000) である。
EscapeSequence :: HexEscapeSequence の文字値は、 HexEscapeSequence の文字値である。
EscapeSequence :: UnicodeEscapeSequence の文字値は、 UnicodeEscapeSequence の文字値である。
CharacterEscapeSequence :: SingleEscapeCharacter の文字値は、次の表に従い SingleEscapeCharacter に決定されるコードポイント値の文字である:
Escape Sequence | Code Point Value | Name | Symbol |
\b | \u0008 | backspace | <BS> |
\t | \u0009 | horizontal tab | <HT> |
\n | \u000A | line feed (new line) | <LF> |
\v | \u000B | vertical tab | <VT> |
\f | \u000C | form feed | <FF> |
\r | \u000D | carriage return | <CR> |
\" | \u0022 | double quote | " |
\' | \u0027 | single quote | ' |
\\ | \u005C | backslash | \ |
CharacterEscapeSequence :: NonEscapeCharacter の文字値は、 NonEscapeCharacter の文字値である。
NonEscapeCharacter :: SourceCharacter but not EscapeCharacter or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
HexEscapeSequence :: x HexDigit HexDigit の文字値は、コードポイント値が (16 × 最初の HexDigit の数学値) + 2番目の HexDigit の数学値 である文字である。
UnicodeEscapeSequence :: u HexDigit HexDigit HexDigit HexDigit の文字値は、コードポイント値が (4096 (すなわち 163) × 最初の HexDigit の数学値) + (256 (すなわち 162) × 2 番目の HexDigit の数学値) + (16 × 3 番目の HexDigit の数学値) + 4 番目の HexDigit の数学値 である文字である。
NOTE 文字 LineTerminator は、それにバックスラッシュ \ を先行させても、文字列リテラル内には出現できない。 行終端子文字を文字列リテラルの文字列地の一部に置く妥当な方法は、 \n や \u000A のようなエスケープシーケンスを用いることである。
NonEscapeCharacter :: SourceCharacter but not EscapeCharacter or LineTerminator の文字値は、 SourceCharacter 文字それ自身である。
HexEscapeSequence :: x HexDigit HexDigit の文字値は、コードポイント値が (16 × 最初の HexDigit の数学値) + 2番目の HexDigit の数学値 である文字である。
UnicodeEscapeSequence :: u HexDigit HexDigit HexDigit HexDigit の文字値は、コードポイント値が (4096 (すなわち 163) × 最初の HexDigit の数学値) + (256 (すなわち 162) × 2 番目の HexDigit の数学値) + (16 × 3 番目の HexDigit の数学値) + 4 番目の HexDigit の数学値 である文字である。
NOTE 文字 LineTerminator は、それにバックスラッシュ \ を先行させても、文字列リテラル内には出現できない。 行終端子文字を文字列リテラルの文字列地の一部に置く妥当な方法は、 \n や \u000A のようなエスケープシーケンスを用いることである。
正規表現リテラル (Regular Expression Literals)
正規表現リテラルは走査時に RegExp オブジェクト(RegExpオブジェクト)に変換される入力要素である。オブジェクトはそれを含むプログラムまた関数の評価の開始前に生成される。リテラル評価はそのオブジェクトへの参照を生成する; それは新規オブジェクト生成はしない。プログラム内の 2 つの正規表現リテラルは、2 つのリテラルの内容がまったく同じであっても、互いに === として比較しない正規表現オブジェクトに評価する。 RegExp オブジェクトは、 new RegExp (RegExp コンストラクタ)や関数としての RegExp コンストラクタ呼出し (関数として呼出される RegExp コンストラクタ)) によって実行時に生成されてもよい。
下の生成規則は正規表現リテラルの構文を記述し、正規表現リテラルの終了の検出に入力要素走査から使用される。 RegularExpressionBody 及び RegularExpressionFlags を構成する文字の文字列は、それ自身がより厳重な文法でそれらを解釈する正規表現コンストラクタに、未解釈で渡される。実装は正規表現コンストラクタの文法を拡張してよいが、 RegularExpressionBody 及び RegularExpressionFlags 生成規則、またはこれらの生成規則によって使用される生成規則を拡張すべきではない。
Syntax
RegularExpressionLiteral ::
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
NonTerminator but not * or \ or /
BackslashSequence
RegularExpressionChar ::
NonTerminator but not \ or /
BackslashSequence
BackslashSequence ::
\ NonTerminator
NonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionFlags ::
[empty]
RegularExpressionFlags IdentifierPart
NOTE 正規表現リテラルは空にはならない; 空の正規表現リテラルをあらわす代わりに、文字 // は 1 行コメントを開始する。空の正規表現を指定するには、 /(?:)/ を用いる。
Semantics
正規表現リテラルは Object 型の値を表す。この値は 2 ステップで決定される: まず、正規表現の RegularExpressionBody 及び RegularExpressionFlags 生成規則拡張を構成する文字が、それぞれ 2 つの文字列の Pattern と Flags に解析されずに集められる。そして new RegExp コンストラクタが 2 つの引数 Pattern と Flags で呼出され、結果は RegularExpressionLiteral の値となる。 new RegExp 呼出しがエラーを生成するならば、実装は、自由裁量で、プログラム走査中に直ちにエラー報告してもよいし、プログラム実行中に正規表現リテラルが評価されるまでエラーを延期してもよい。
下の生成規則は正規表現リテラルの構文を記述し、正規表現リテラルの終了の検出に入力要素走査から使用される。 RegularExpressionBody 及び RegularExpressionFlags を構成する文字の文字列は、それ自身がより厳重な文法でそれらを解釈する正規表現コンストラクタに、未解釈で渡される。実装は正規表現コンストラクタの文法を拡張してよいが、 RegularExpressionBody 及び RegularExpressionFlags 生成規則、またはこれらの生成規則によって使用される生成規則を拡張すべきではない。
Syntax
RegularExpressionLiteral ::
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
NonTerminator but not * or \ or /
BackslashSequence
RegularExpressionChar ::
NonTerminator but not \ or /
BackslashSequence
BackslashSequence ::
\ NonTerminator
NonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionFlags ::
[empty]
RegularExpressionFlags IdentifierPart
NOTE 正規表現リテラルは空にはならない; 空の正規表現リテラルをあらわす代わりに、文字 // は 1 行コメントを開始する。空の正規表現を指定するには、 /(?:)/ を用いる。
Semantics
正規表現リテラルは Object 型の値を表す。この値は 2 ステップで決定される: まず、正規表現の RegularExpressionBody 及び RegularExpressionFlags 生成規則拡張を構成する文字が、それぞれ 2 つの文字列の Pattern と Flags に解析されずに集められる。そして new RegExp コンストラクタが 2 つの引数 Pattern と Flags で呼出され、結果は RegularExpressionLiteral の値となる。 new RegExp 呼出しがエラーを生成するならば、実装は、自由裁量で、プログラム走査中に直ちにエラー報告してもよいし、プログラム実行中に正規表現リテラルが評価されるまでエラーを延期してもよい。
自動セミコロン挿入
ある種の ECMAScript 文 (空文 (empty statement), 変数文 (variable statement), 式文 (expression statement), do-while 文 (do-while statement), continue 文 (continue statement), break 文 (break statement), return 文 (return statement), turhow 文 (throw statement)) はセミコロンで終了しなければならない。そのようなセミコロンは、ソーステキスト内に常に明示的に出現してよい。しかしながら、簡単にするために、ある位置ではソーステキストからセミコロンを省略してよい。この位置は、それらの位置のソースコードトークンのストリームにセミコロンが自動的に挿入されるという言葉で説明される。
自動セミコロン挿入規則
プログラムが左から右へと解析され、文法の任意の生成規則によって許可されないトークン (違反トークン (offending token) と呼ばれる) に遭遇するとき、次の条件に 1 つ以上当てはまる場合、違反トークンの前にセミコロンが自動的に挿入される。:
1. 違反トークンが、少なくとも 1 つの LineTerminator で、前のトークンから分離されている。
2. 違反トークンが、 } である。
プログラムが左から右へと解析され、トークンの入力ストリームが終了し、解析器が入力トークンストリームを一つの完全な ECMAScript Program として解析できないとき、入力ストリームの末尾にセミコロンが自動的に挿入される。
プログラムが左から右へと解析され、文法の任意の生成規則によって許可されないトークンに遭遇するが、その生成規則が限定生成規則 (resutricted production) であり、限定生成規則内部\で注記 "[no LineTerminator here]" にすぐ続く終端記号または非終端記号の最初のトークン (そのためこのようなトークンは限定トークン (restricted token) と呼ばれる) であり、そして限定トークンが少なくとも 1 つの LineTerminator で前のトークンから分離されているとき、限定トークンの前にセミコロンが自動的に挿入される。
とはいえ、以上の規則を上書きする条件を追加する: セミコロンが結果として空文として解析される場合、またセミコロンが for 文(文 for文) のヘッダ内の 2 つのセミコロンの一つになる場合は、セミコロンは自動的に挿入されない。
NOTE 文法における限定生成規則は下記のみである:
PostfixExpression :
LeftHandSideExpression [LineTerminator 無し] ++
LeftHandSideExpression [LineTerminator 無し] --
ContinueStatement :
continue [LineTerminator 無し] Identifieropt ;
BreakStatement :
break [LineTerminator 無し] Identifieropt ;
ReturnStatement :
return [LineTerminator 無し] Expressionopt ;
ThrowStatement :
throw [LineTerminator 無し] Expression ;
これらの限定生成規則の実際の効果は、次のとおりである:
解析器がそれを後置演算子として扱う場所に ++, -- トークンが出現し、少なくとも一つ以上の LineTerminator が前のトークンと ++, -- トークンの間に出現するとき, セミコロンが ++, -- トークンの前に自動的に挿入される。
continue, break, return, throw トークンが出現し、次のトークンの前に LineTerminator が出現するとき、セミコロンは continue, break, return, throw トークンの後に自動的に挿入される。
ECMAScript プログラマへの結果的な実用的助言は:
後置 ++ 演算子、また後置 -- 演算子は、項と同じ行に出現するべきである。
return 文、また throw 文中の Expression は、return トークンまた throw トークンと同じ行で開始するべきである。
break 文、また continue 文のラベルは、 break トークンまた continue トークンと同じ行にあるべきである。
1. 違反トークンが、少なくとも 1 つの LineTerminator で、前のトークンから分離されている。
2. 違反トークンが、 } である。
プログラムが左から右へと解析され、トークンの入力ストリームが終了し、解析器が入力トークンストリームを一つの完全な ECMAScript Program として解析できないとき、入力ストリームの末尾にセミコロンが自動的に挿入される。
プログラムが左から右へと解析され、文法の任意の生成規則によって許可されないトークンに遭遇するが、その生成規則が限定生成規則 (resutricted production) であり、限定生成規則内部\で注記 "[no LineTerminator here]" にすぐ続く終端記号または非終端記号の最初のトークン (そのためこのようなトークンは限定トークン (restricted token) と呼ばれる) であり、そして限定トークンが少なくとも 1 つの LineTerminator で前のトークンから分離されているとき、限定トークンの前にセミコロンが自動的に挿入される。
とはいえ、以上の規則を上書きする条件を追加する: セミコロンが結果として空文として解析される場合、またセミコロンが for 文(文 for文) のヘッダ内の 2 つのセミコロンの一つになる場合は、セミコロンは自動的に挿入されない。
NOTE 文法における限定生成規則は下記のみである:
PostfixExpression :
LeftHandSideExpression [LineTerminator 無し] ++
LeftHandSideExpression [LineTerminator 無し] --
ContinueStatement :
continue [LineTerminator 無し] Identifieropt ;
BreakStatement :
break [LineTerminator 無し] Identifieropt ;
ReturnStatement :
return [LineTerminator 無し] Expressionopt ;
ThrowStatement :
throw [LineTerminator 無し] Expression ;
これらの限定生成規則の実際の効果は、次のとおりである:
解析器がそれを後置演算子として扱う場所に ++, -- トークンが出現し、少なくとも一つ以上の LineTerminator が前のトークンと ++, -- トークンの間に出現するとき, セミコロンが ++, -- トークンの前に自動的に挿入される。
continue, break, return, throw トークンが出現し、次のトークンの前に LineTerminator が出現するとき、セミコロンは continue, break, return, throw トークンの後に自動的に挿入される。
ECMAScript プログラマへの結果的な実用的助言は:
後置 ++ 演算子、また後置 -- 演算子は、項と同じ行に出現するべきである。
return 文、また throw 文中の Expression は、return トークンまた throw トークンと同じ行で開始するべきである。
break 文、また continue 文のラベルは、 break トークンまた continue トークンと同じ行にあるべきである。
自動セミコロン挿入例
次のソース
{ 1 2 } 3
は、ECMAScript 文法において、自動セミコロン挿入規則を以ってしても有効な文ではない。
対照的に、このソース
対照的に、このソース
{ 1 2 } 3
もまた有効な ECMAScript 文ではないが、自動セミコロン挿入によって次のように変換される:
{ 1 ;2 ;} 3;
これは有効な ECMAScript 文である。
ソース
ソース
for (a; b )
は有効な ECMAScript 文ではなく、自動セミコロン挿入によって変更されない。セミコロンが for 文のヘッダに要求されるからである。自動セミコロン挿入が for 文のヘッダ内の 2 つのセミコロンの 1 つを挿入することはない。
ソース
ソース
return a + b
は自動セミコロン挿入によって次のように変換される:
return; a + b;
NOTE 式 a + b は、 return 文によって返される値として扱われない。return トークンから LineTerminator で分離されているからである。
ソース
ソース
a = b ++c
は自動セミコロン挿入によって次のように変換される:
a = b; ++c;
NOTE トークン ++ は、変数 b に適用される後置演算子として扱われない。 b と ++ の間に LineTerminator があるからである。
ソース
ソース
if (a > b) else c = d
は有効な ECMAScript 文ではなく、その位置に適用する文法の生成規則がないとしても、 else トークンの前への自動セミコロン挿入によって変更されない。自動セミコロン挿入が空文として解析されるからである。
ソース
ソース
a = b + c (d + e).print()
は自動セミコロン挿入によって変換されない。 2 行目の括弧式 () は関数呼び出しの引数リストとして解釈できるからである。
a = b + c(d + e).print()
代入文が左括弧で開始しなければならない状況では、自動セミコロン挿入を信頼するより、先行する文の末尾に明示的なセミコロンを提供する方が、プログラマにとってよい発想である。