페이지 표시 설정

12 ECMAScript 언어: 어휘 문법

ECMAScript Script 또는 Module의 소스 텍스트는 먼저 토큰, 줄 종결자, 주석 또는 공백인 입력 요소의 시퀀스로 변환됩니다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 가능한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 반복해서 취합니다.

어휘 입력 요소를 식별하는 방식이 해당 입력 요소를 소비하는 구문 문법 문맥에 따라 달라지는 상황이 여러 가지 있습니다. 따라서 어휘 문법에는 여러 목표 기호가 필요합니다. InputElementHashbangOrRegExp 목표는 Script 또는 Module의 시작 부분에서 사용됩니다. InputElementRegExpOrTemplateTail 목표는 RegularExpressionLiteral, TemplateMiddle 또는 TemplateTail이 허용되는 구문 문법 문맥에서 사용됩니다. InputElementRegExp 목표 기호는 RegularExpressionLiteral은 허용되지만 TemplateMiddle과 TemplateTail은 모두 허용되지 않는 모든 구문 문법 문맥에서 사용됩니다. InputElementTemplateTail 목표는 TemplateMiddle 또는 TemplateTail은 허용되지만 RegularExpressionLiteral은 허용되지 않는 모든 구문 문법 문맥에서 사용됩니다. 그 밖의 모든 문맥에서는 InputElementDiv를 어휘 목표 기호로 사용합니다.

참고

여러 어휘 목표를 사용하면 자동 세미콜론 삽입에 영향을 주는 어휘적 모호성이 발생하지 않습니다. 예를 들어 선행 나눗셈 또는 나눗셈 할당과 선행 RegularExpressionLiteral이 모두 허용되는 구문 문법 문맥은 없습니다. 세미콜론 삽입(12.10 참조)은 이에 영향을 주지 않습니다. 다음과 같은 예에서:

a = b
/hi/g.exec(c).map(d);

LineTerminator 뒤의 첫 번째 비공백, 비주석 코드 포인트가 U+002F (SOLIDUS)이고 구문 문맥이 나눗셈 또는 나눗셈 할당을 허용하면 LineTerminator에 세미콜론을 삽입하지 않습니다. 즉, 위 예제는 다음과 동일하게 해석됩니다:

a = b / hi / g.exec(c).map(d);

구문

InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral

12.1 유니코드 형식 제어 문자

유니코드 형식 제어 문자(즉, LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK와 같은 유니코드 문자 데이터베이스의 “Cf” 범주에 속하는 문자)는 마크업 언어와 같은 상위 수준 프로토콜이 없는 경우 일정 범위의 텍스트 형식을 제어하는 데 사용하는 제어 코드입니다.

소스 텍스트에서 형식 제어 문자를 허용하면 편집과 표시가 편리해집니다. 모든 형식 제어 문자는 주석과 문자열 리터럴, 템플릿 리터럴 및 정규 표현식 리터럴 안에서 사용할 수 있습니다.

U+FEFF (ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트 시작 부분에서 해당 텍스트가 유니코드임을 표시하고 텍스트의 인코딩과 바이트 순서를 감지할 수 있도록 하는 데 사용하는 형식 제어 문자입니다. 이러한 목적으로 사용하는 <ZWNBSP> 문자는 파일 연결 등의 결과로 텍스트 시작 부분 이후에도 나타날 수 있습니다. ECMAScript 소스 텍스트에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴 및 정규 표현식 리터럴 바깥에서는 공백 문자로 취급됩니다(12.2 참조).

12.2 공백

공백 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(더 이상 나눌 수 없는 어휘 단위)을 서로 분리하는 데 사용되지만 그 밖에는 중요하지 않습니다. 공백 코드 포인트는 임의의 두 토큰 사이와 입력의 시작 또는 끝에 나타날 수 있습니다. 공백 코드 포인트는 StringLiteral, RegularExpressionLiteral, Template 또는 TemplateSubstitutionTail 안에 나타날 수 있으며, 이 경우 리터럴 값의 일부를 구성하는 의미 있는 코드 포인트로 간주됩니다. Comment 안에도 나타날 수 있지만 그 밖의 다른 종류의 토큰 안에는 나타날 수 없습니다.

ECMAScript 공백 코드 포인트는 표 31에 나열되어 있습니다.

표 31: 공백 코드 포인트
코드 포인트 이름 약어
U+0009 CHARACTER TABULATION <TAB>
U+000B LINE TABULATION <VT>
U+000C FORM FEED (FF) <FF>
U+FEFF ZERO WIDTH NO-BREAK SPACE <ZWNBSP>
일반 범주 “Space_Separator”의 모든 코드 포인트 <USP>
참고 1

U+0020 (SPACE) 및 U+00A0 (NO-BREAK SPACE) 코드 포인트는 <USP>의 일부입니다.

참고 2

표 31에 나열된 코드 포인트를 제외하면 ECMAScript WhiteSpace는 유니코드 “White_Space” 프로퍼티를 갖지만 일반 범주 “Space_Separator” (“Zs”)로 분류되지 않는 모든 코드 포인트를 의도적으로 제외합니다.

구문

WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP>

12.3 줄 종결자

공백 코드 포인트와 마찬가지로 줄 종결자 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(더 이상 나눌 수 없는 어휘 단위)을 서로 분리하는 데 사용됩니다. 그러나 공백 코드 포인트와 달리 줄 종결자는 구문 문법의 동작에 일부 영향을 줍니다. 일반적으로 줄 종결자는 임의의 두 토큰 사이에 나타날 수 있지만 구문 문법에 의해 금지되는 위치도 일부 있습니다. 줄 종결자는 자동 세미콜론 삽입 과정(12.10)에도 영향을 줍니다. 줄 종결자는 StringLiteral, Template 또는 TemplateSubstitutionTail을 제외한 어떤 토큰 안에도 나타날 수 없습니다. <LF> 및 <CR> 줄 종결자는 LineContinuation의 일부인 경우를 제외하면 StringLiteral 토큰 안에 나타날 수 없습니다.

줄 종결자는 MultiLineComment 안에 나타날 수 있지만 SingleLineComment 안에는 나타날 수 없습니다.

줄 종결자는 정규 표현식의 \s 클래스와 일치하는 공백 코드 포인트 집합에 포함됩니다.

ECMAScript 줄 종결자 코드 포인트는 표 32에 나열되어 있습니다.

표 32: 줄 종결자 코드 포인트
코드 포인트 유니코드 이름 약어
U+000A LINE FEED (LF) <LF>
U+000D CARRIAGE RETURN (CR) <CR>
U+2028 LINE SEPARATOR <LS>
U+2029 PARAGRAPH SEPARATOR <PS>

표 32에 있는 유니코드 코드 포인트만 줄 종결자로 취급됩니다. 그 밖의 개행 또는 줄바꿈 유니코드 코드 포인트는 줄 종결자로 취급되지 않지만 표 31에 나열된 요구 사항을 충족하면 공백으로 취급됩니다.

구문

LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF> 참고

생성 규칙 LineTerminatorSequence :: <CR> <LF> 은 진단에서 줄 번호를 보고할 때와 같이 전체가 하나의 줄 종결자로 동작해야 하는 코드 포인트 시퀀스와 일치합니다.

12.4 주석

주석은 한 줄 또는 여러 줄일 수 있습니다. 여러 줄 주석은 중첩할 수 없습니다.

한 줄 주석에는 LineTerminator 코드 포인트를 제외한 모든 유니코드 코드 포인트가 포함될 수 있고, 토큰은 항상 가능한 한 길게 취한다는 일반 규칙이 있으므로 한 줄 주석은 항상 // 표시부터 줄 끝까지의 모든 코드 포인트로 구성됩니다. 그러나 줄 끝의 LineTerminator는 한 줄 주석의 일부로 간주되지 않습니다. 이는 어휘 문법에서 별도로 인식되며 구문 문법의 입력 요소 스트림 일부가 됩니다. 이 점은 매우 중요합니다. 한 줄 주석의 존재 여부가 자동 세미콜론 삽입 과정(12.10 참조)에 영향을 주지 않음을 의미하기 때문입니다.

주석은 공백처럼 동작하며 버려집니다. 단, MultiLineComment에 줄 종결자 코드 포인트가 포함되어 있으면 구문 문법으로 파싱할 때 전체 주석을 LineTerminator로 간주합니다.

구문

Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator

이 절의 여러 생성 규칙에는 B.1.1 절에서 대체 정의가 제공됩니다.

12.5 Hashbang 주석

Hashbang 주석은 위치에 민감하며 다른 종류의 주석과 마찬가지로 구문 문법의 입력 요소 스트림에서 제거됩니다.

구문

HashbangComment :: #! SingleLineCommentCharsopt

12.6 토큰

구문

CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template 참고

DivPunctuator, RegularExpressionLiteral, RightBracePunctuator 및 TemplateSubstitutionTail 생성 규칙은 CommonToken 생성 규칙에 포함되지 않은 추가 토큰을 파생합니다.

12.7 이름과 키워드

IdentifierName과 ReservedWord는 유니코드 표준 부속서 #31, Identifier and Pattern Syntax에 제시된 기본 식별자 구문을 약간 수정하여 해석하는 토큰입니다. ReservedWord는 IdentifierName의 열거된 부분집합입니다. 구문 문법은 Identifier를 ReservedWord가 아닌 IdentifierName으로 정의합니다. 유니코드 식별자 문법은 유니코드 표준에서 명시한 문자 프로퍼티를 기반으로 합니다. 최신 버전의 유니코드 표준에서 지정된 범주에 속하는 유니코드 코드 포인트는 모든 적합한 ECMAScript 구현체에서 해당 범주에 속하는 것으로 취급해야 합니다. ECMAScript 구현체는 이후 버전의 유니코드 표준에서 정의된 식별자 코드 포인트를 인식할 수 있습니다.

참고 1

이 표준은 특정 코드 포인트의 추가를 명시합니다. U+0024 (DOLLAR SIGN) 및 U+005F (LOW LINE)은 IdentifierName의 어느 위치에서든 허용됩니다.

구문

PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: any Unicode code point with the Unicode property “ID_Start” UnicodeIDContinue :: any Unicode code point with the Unicode property “ID_Continue”

비단말 기호 UnicodeEscapeSequence의 정의는 12.9.4에 제시되어 있습니다.

참고 2

비단말 기호 IdentifierPart는 UnicodeIDContinue를 통해 _를 파생합니다.

참고 3

유니코드 프로퍼티 “ID_Start” 및 “ID_Continue”을 갖는 코드 포인트 집합에는 각각 유니코드 프로퍼티 “Other_ID_Start” 및 “Other_ID_Continue”을 갖는 코드 포인트가 포함됩니다.

12.7.1 식별자 이름

IdentifierName에서는 유니코드 이스케이프 시퀀스가 허용되며, 해당 시퀀스는 UnicodeEscapeSequence의 IdentifierCodePoint와 같은 하나의 유니코드 코드 포인트에 기여합니다. UnicodeEscapeSequence 앞의 \는 어떤 코드 포인트에도 기여하지 않습니다. UnicodeEscapeSequence를 사용하여 그렇지 않았다면 유효하지 않았을 코드 포인트를 IdentifierName에 기여할 수는 없습니다. 다시 말해 \ UnicodeEscapeSequence 시퀀스를 그것이 기여하는 SourceCharacter로 교체하더라도 그 결과는 원래 IdentifierName과 정확히 동일한 SourceCharacter 요소 시퀀스를 갖는 유효한 IdentifierName이어야 합니다. 이 명세에서 IdentifierName을 해석할 때는 특정 코드 포인트를 기여하는 데 이스케이프 시퀀스가 사용되었는지 여부와 관계없이 실제 코드 포인트를 기반으로 합니다.

유니코드 표준에 따라 정규적으로 동등한 두 IdentifierName이라도 각 UnicodeEscapeSequence를 교체한 후 정확히 동일한 코드 포인트 시퀀스로 표현되지 않으면 같지 않습니다.

12.7.1.1 Static Semantics: 조기 오류

IdentifierStart :: \ UnicodeEscapeSequence IdentifierPart :: \ UnicodeEscapeSequence

12.7.1.2 Static Semantics: IdentifierCodePoints

구문 지향 연산 IdentifierCodePoints. 인수 없음. 반환값: 리스트 (요소: 코드 포인트). 다음 생성 규칙별로 정의된다.

IdentifierName :: IdentifierStart
  1. codePoint를 IdentifierStart의 IdentifierCodePoint로 둡니다.
  2. « codePoint »를 반환합니다.
IdentifierName :: IdentifierName IdentifierPart
  1. codePoints를 파생된 IdentifierName의 IdentifierCodePoints로 둡니다.
  2. codePoint를 IdentifierPart의 IdentifierCodePoint로 둡니다.
  3. codePoints와 « codePoint »의 목록 연결을 반환합니다.

12.7.1.3 Static Semantics: IdentifierCodePoint

구문 지향 연산 IdentifierCodePoint. 인수 없음. 반환값: 코드 포인트. 다음 생성 규칙별로 정의된다.

IdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar와 일치하는 코드 포인트를 반환합니다.
IdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar와 일치하는 코드 포인트를 반환합니다.
UnicodeEscapeSequence :: u Hex4Digits
  1. 숫자 값이 Hex4Digits의 MV인 코드 포인트를 반환합니다.
UnicodeEscapeSequence :: u{ CodePoint }
  1. 숫자 값이 CodePoint의 MV인 코드 포인트를 반환합니다.

12.7.2 키워드와 예약어

키워드는 IdentifierName과 일치하면서 구문적 용도도 갖는 토큰입니다. 즉, 일부 구문 생성 규칙에서 fixed width 글꼴의 리터럴로 나타납니다. ECMAScript의 키워드에는 if, while, async, await 등이 있습니다.

예약어는 식별자로 사용할 수 없는 IdentifierName입니다. 많은 키워드가 예약어이지만 그렇지 않은 키워드도 있으며, 특정 문맥에서만 예약되는 키워드도 있습니다. if와 while은 예약어입니다. await는 async 함수와 모듈 안에서만 예약됩니다. async는 예약되지 않으며 변수 이름이나 문 레이블로 제한 없이 사용할 수 있습니다.

이 명세는 문법 생성 규칙과 조기 오류 규칙을 조합하여 어떤 이름이 유효한 식별자이고 어떤 이름이 예약어인지 명시합니다. 아래 ReservedWord 목록의 모든 토큰은 await와 yield를 제외하면 무조건 예약됩니다. await와 yield의 예외는 매개변수화된 구문 생성 규칙을 사용하여 13.1에 명시되어 있습니다. 마지막으로 여러 조기 오류 규칙이 유효한 식별자의 집합을 제한합니다. 13.1.1, 14.3.1.1, 14.7.5.1 및 15.7.1를 참조하시기 바랍니다. 요약하면 식별자 이름에는 다음 다섯 범주가 있습니다:

  • Math, window, toString, _처럼 항상 식별자로 허용되며 키워드는 아닌 이름;

  • 아래에 나열된 ReservedWord 중 await와 yield를 제외하고 절대로 식별자로 허용되지 않는 이름;

  • 문맥에 따라 식별자로 허용되는 이름, 즉 await와 yield;

  • 엄격 모드 코드에서 문맥에 따라 식별자로 허용되지 않는 이름: let, static, implements, interface, package, private, protected, public;

  • 항상 식별자로 허용되지만 Identifier가 허용되지 않는 특정 구문 생성 규칙의 위치에서 키워드로도 나타나는 이름: as, async, from, get, meta, of, set, target.

조건부 키워드 또는 문맥적 키워드라는 용어는 마지막 세 범주에 속하여 일부 문맥에서는 식별자로, 다른 문맥에서는 키워드로 사용할 수 있는 키워드를 가리키는 데 사용되기도 합니다.

구문

ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield 참고 1

5.1.5에 따라 문법의 키워드는 특정 SourceCharacter 요소의 리터럴 시퀀스와 일치합니다. 키워드 안의 코드 포인트를 \ UnicodeEscapeSequence로 표현할 수 없습니다.

IdentifierName에는 \ UnicodeEscapeSequence가 포함될 수 있지만 els\u{65}라고 작성하여 “else”라는 이름의 변수를 선언할 수는 없습니다. 13.1.1의 조기 오류 규칙은 예약어와 동일한 StringValue를 갖는 식별자를 배제합니다.

참고 2

enum은 현재 이 명세에서 키워드로 사용되지 않습니다. 이는 향후 언어 확장에서 키워드로 사용하기 위해 따로 예약해 둔 미래 예약어입니다.

마찬가지로 implements, interface, package, private, protected, public은 엄격 모드 코드에서 미래 예약어입니다.

참고 3

arguments와 eval이라는 이름은 키워드가 아니지만 엄격 모드 코드에서는 일부 제한을 받습니다. 13.1.1, 8.6.4, 15.2.1, 15.5.1, 15.6.1 및 15.8.1를 참조하시기 바랍니다.

12.8 구두점

구문

Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: }

12.9 리터럴

12.9.1 Null 리터럴

구문

NullLiteral :: null

12.9.2 Boolean 리터럴

구문

BooleanLiteral :: true false

12.9.3 숫자 리터럴

구문

NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: DecimalDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator 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[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 LegacyOctalLikeDecimalDigitsopt NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalDigits :: OctalDigit LegacyOctalLikeDecimalDigits OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit 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

NumericLiteral 바로 뒤에 오는 SourceCharacter는 IdentifierStart 또는 DecimalDigit이어서는 안 됩니다.

참고

예를 들어 3in은 오류이며 두 입력 요소 3과 in이 아닙니다.

12.9.3.1 Static Semantics: 조기 오류

NumericLiteral :: LegacyOctalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
  • IsStrict(this production)이 true이면 Syntax Error입니다.
참고
비엄격 코드에서 이 구문은 Legacy입니다.

12.9.3.2 Static Semantics: MV

숫자 리터럴은 Number 타입 또는 BigInt 타입의 값을 나타냅니다.

12.9.3.3 Static Semantics: NumericValue

구문 지향 연산 NumericValue. 인수 없음. 반환값: (Number 또는 BigInt). 다음 생성 규칙별로 정의된다.

NumericLiteral :: DecimalLiteral
  1. RoundMVResult(DecimalLiteral의 MV)를 반환합니다.
NumericLiteral :: NonDecimalIntegerLiteral
  1. 𝔽(NonDecimalIntegerLiteral의 MV)를 반환합니다.
NumericLiteral :: LegacyOctalIntegerLiteral
  1. 𝔽(LegacyOctalIntegerLiteral의 MV)를 반환합니다.
NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix
  1. NonDecimalIntegerLiteral의 MV에 대한 BigInt 값을 반환합니다.
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
  1. 0ℤ을 반환합니다.
DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix
  1. NonZeroDigit의 MV에 대한 BigInt 값을 반환합니다.
DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
  1. n을 NumericLiteralSeparator의 모든 출현을 제외한 DecimalDigits의 코드 포인트 수로 설정합니다.
  2. mv를 (NonZeroDigit의 MV × 10n) + DecimalDigits의 MV로 설정합니다.
  3. ℤ(mv)를 반환합니다.

12.9.4 String 리터럴

참고 1

문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 0개 이상의 유니코드 코드 포인트입니다. 유니코드 코드 포인트는 이스케이프 시퀀스로 나타낼 수도 있습니다. 닫는 따옴표 코드 포인트, U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), U+000A (LINE FEED)를 제외한 모든 코드 포인트는 문자열 리터럴에 그대로 나타날 수 있습니다. 모든 코드 포인트는 이스케이프 시퀀스의 형태로 나타날 수 있습니다. 문자열 리터럴은 ECMAScript String 값으로 평가됩니다. 이러한 String 값을 생성할 때 유니코드 코드 포인트는 11.1.1에 정의된 대로 UTF-16으로 인코딩됩니다. 기본 다국어 평면에 속하는 코드 포인트는 문자열의 하나의 코드 단위 요소로 인코딩됩니다. 그 밖의 모든 코드 포인트는 문자열의 두 코드 단위 요소로 인코딩됩니다.

구문

StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

비단말 기호 HexDigit의 정의는 12.9.3에 제시되어 있습니다. SourceCharacter는 11.1에 정의되어 있습니다.

참고 2

<LF> 및 <CR>은 빈 코드 포인트 시퀀스를 생성하기 위한 LineContinuation의 일부인 경우를 제외하면 문자열 리터럴에 나타날 수 없습니다. 문자열 리터럴의 String 값에 이들을 포함하는 올바른 방법은 \n 또는 \u000A와 같은 이스케이프 시퀀스를 사용하는 것입니다.

12.9.4.1 Static Semantics: 조기 오류

EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence
  • IsStrict(this production)이 true이면 Syntax Error입니다.
참고 1
비엄격 코드에서 이 구문은 Legacy입니다.
참고 2

문자열 리터럴이 둘러싸는 코드를 엄격 모드로 만드는 Use Strict 지시문보다 앞에 나타날 수 있으며, 구현체는 이러한 리터럴에 위 규칙을 적용하도록 주의해야 합니다. 예를 들어 다음 소스 텍스트에는 Syntax Error가 포함되어 있습니다:

function invalid() { "\7"; "use strict"; }

12.9.4.2 Static Semantics: SV

구문 지향 연산 SV. 인수 없음. 반환값: String.

문자열 리터럴은 String 타입의 값을 나타냅니다. SV는 문자열 리터럴의 여러 부분에 재귀적으로 적용하여 문자열 리터럴의 String 값을 생성합니다. 이 과정의 일부로 문자열 리터럴 안의 일부 유니코드 코드 포인트는 아래 또는 12.9.3에 설명된 대로 수학적 값을 갖는 것으로 해석됩니다.

표 33: String 단일 문자 이스케이프 시퀀스
이스케이프 시퀀스 코드 단위 값 유니코드 문자 이름 기호
\b 0x0008 BACKSPACE <BS>
\t 0x0009 CHARACTER TABULATION <HT>
\n 0x000A LINE FEED (LF) <LF>
\v 0x000B LINE TABULATION <VT>
\f 0x000C FORM FEED (FF) <FF>
\r 0x000D CARRIAGE RETURN (CR) <CR>
\" 0x0022 QUOTATION MARK "
\' 0x0027 APOSTROPHE '
\\ 0x005C REVERSE SOLIDUS \

12.9.4.3 Static Semantics: MV

12.9.5 정규 표현식 리터럴

참고 1

정규 표현식 리터럴은 리터럴을 평가할 때마다 RegExp 객체(22.2 참조)로 변환되는 입력 요소입니다. 프로그램 안의 두 정규 표현식 리터럴은 두 리터럴의 내용이 동일하더라도 서로 ===로 비교했을 때 절대로 같은 것으로 평가되지 않는 정규 표현식 객체가 됩니다. RegExp 객체는 런타임에 new RegExp를 사용하거나 RegExp 생성자를 함수로 호출하여 생성할 수도 있습니다(22.2.4 참조).

아래 생성 규칙은 정규 표현식 리터럴의 구문을 설명하며 입력 요소 스캐너가 정규 표현식 리터럴의 끝을 찾는 데 사용합니다. 이후 RegularExpressionBody와 RegularExpressionFlags를 구성하는 소스 텍스트는 더 엄격한 ECMAScript 정규 표현식 문법(22.2.1)을 사용하여 다시 파싱됩니다.

구현체는 22.2.1에 정의된 ECMAScript 정규 표현식 문법을 확장할 수 있지만 아래 정의된 RegularExpressionBody 및 RegularExpressionFlags 생성 규칙이나 이 생성 규칙에서 사용하는 생성 규칙을 확장해서는 안 됩니다.

구문

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar 참고 2

정규 표현식 리터럴은 비어 있을 수 없습니다. 빈 정규 표현식 리터럴을 나타내는 대신 코드 단위 시퀀스 //는 한 줄 주석을 시작합니다. 빈 정규 표현식을 지정하려면 /(?:)/을 사용하시기 바랍니다.

12.9.5.1 Static Semantics: BodyText

구문 지향 연산 BodyText. 인수 없음. 반환값: 소스 텍스트. 다음 생성 규칙별로 정의된다.

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionBody로 인식된 소스 텍스트를 반환합니다.

12.9.5.2 Static Semantics: FlagText

구문 지향 연산 FlagText. 인수 없음. 반환값: 소스 텍스트. 다음 생성 규칙별로 정의된다.

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionFlags로 인식된 소스 텍스트를 반환합니다.

12.9.6 템플릿 리터럴 어휘 구성 요소

구문

Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF 참고

TemplateSubstitutionTail은 InputElementTemplateTail 대체 어휘 목표에서 사용됩니다.

12.9.6.1 Static Semantics: TV

구문 지향 연산 TV. 인수 없음. 반환값: (String 또는 undefined). 템플릿 리터럴 구성 요소는 TV에 의해 String 타입의 값으로 해석됩니다. TV는 템플릿 객체의 인덱스 구성 요소(일반적으로 템플릿 값이라고 부릅니다)를 구성하는 데 사용됩니다. TV에서는 이스케이프 시퀀스를 해당 이스케이프 시퀀스가 나타내는 유니코드 코드 포인트의 UTF-16 코드 단위로 교체합니다.

12.9.6.2 Static Semantics: TRV

구문 지향 연산 TRV. 인수 없음. 반환값: String. 템플릿 리터럴 구성 요소는 TRV에 의해 String 타입의 값으로 해석됩니다. TRV는 템플릿 객체의 원시 구성 요소(일반적으로 템플릿 원시 값이라고 부릅니다)를 구성하는 데 사용됩니다. TRV는 TV와 유사하지만 TRV에서는 이스케이프 시퀀스를 리터럴에 나타난 그대로 해석한다는 차이가 있습니다.

참고

TV는 LineContinuation의 코드 단위를 제외하지만 TRV는 이를 포함합니다. <CR><LF> 및 <CR> LineTerminatorSequence는 TV와 TRV 모두에서 <LF>로 정규화됩니다. <CR> 또는 <CR><LF> 시퀀스를 포함하려면 명시적인 TemplateEscapeSequence가 필요합니다.

12.10 자동 세미콜론 삽입

대부분의 ECMAScript 문과 선언은 세미콜론으로 끝나야 합니다. 이러한 세미콜론은 항상 소스 텍스트에 명시적으로 나타날 수 있습니다. 그러나 편의를 위해 특정 상황에서는 소스 텍스트에서 이러한 세미콜론을 생략할 수 있습니다. 이러한 상황은 해당 위치에서 소스 코드 토큰 스트림에 세미콜론이 자동으로 삽입된다고 설명합니다.

12.10.1 자동 세미콜론 삽입 규칙

다음 규칙에서 “토큰”은 12 절에 설명된 현재 어휘 목표 기호를 사용하여 결정된 실제로 인식된 어휘 토큰을 의미합니다.

세미콜론 삽입에는 세 가지 기본 규칙이 있습니다:

  1. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱하는 동안 문법의 어떤 생성 규칙에서도 허용되지 않는 토큰(문제 토큰이라고 합니다)을 만났을 때 다음 조건 중 하나 이상이 참이면 문제 토큰 앞에 세미콜론이 자동으로 삽입됩니다:

    • 문제 토큰과 이전 토큰 사이에 최소 하나의 LineTerminator가 있습니다.
    • 문제 토큰이 }입니다.
    • 이전 토큰이 )이고 삽입된 세미콜론이 do-while 문(14.7.2)을 종료하는 세미콜론으로 파싱됩니다.
  2. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱하는 동안 입력 토큰 스트림의 끝에 도달했고 파서가 입력 토큰 스트림을 목표 비단말 기호의 단일 인스턴스로 파싱할 수 없으면 입력 스트림 끝에 세미콜론이 자동으로 삽입됩니다.
  3. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱하는 동안 문법의 어떤 생성 규칙에서는 허용되는 토큰을 만났지만 해당 생성 규칙이 제한된 생성 규칙이고 그 토큰이 제한된 생성 규칙 안에서 주석 “[no LineTerminator here]” 바로 뒤의 단말 또는 비단말에 대한 첫 번째 토큰이 되며(따라서 이러한 토큰을 제한 토큰이라고 합니다), 제한 토큰과 이전 토큰 사이에 최소 하나의 LineTerminator가 있으면 제한 토큰 앞에 세미콜론이 자동으로 삽입됩니다.

그러나 앞의 규칙에는 이를 우선하는 추가 조건이 있습니다. 삽입된 세미콜론이 빈 문으로 파싱되거나 for 문의 헤더에 있는 두 세미콜론 중 하나가 되는 경우(14.7.4 참조)에는 세미콜론을 절대로 자동으로 삽입하지 않습니다.

참고

문법에서 제한된 생성 규칙은 다음뿐입니다:

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- UsingDeclaration[In, Yield, Await] : using [no LineTerminator here] BindingList[?In, ?Yield, ?Await, ~Pattern] ; ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

이러한 제한된 생성 규칙의 실질적인 효과는 다음과 같습니다:

  • 파서가 후위 연산자로 취급할 위치에서 ++ 또는 -- 토큰을 만났고 이전 토큰과 ++ 또는 -- 토큰 사이에 최소 하나의 LineTerminator가 있으면 ++ 또는 -- 토큰 앞에 세미콜론이 자동으로 삽입됩니다.
  • using 토큰을 만났고 IdentifierName 토큰 전에 LineTerminator를 만나면 using 토큰 뒤에 세미콜론이 자동으로 삽입됩니다.
  • continue, break, return, throw 또는 yield 토큰을 만났고 다음 토큰 전에 LineTerminator를 만나면 continue, break, return, throw 또는 yield 토큰 뒤에 세미콜론이 자동으로 삽입됩니다.
  • 화살표 함수의 매개변수 뒤에서 => 토큰 전에 LineTerminator가 나타나면 세미콜론이 자동으로 삽입되고 구두점으로 인해 구문 오류가 발생합니다.
  • async 토큰 뒤에서 function, IdentifierName 또는 ( 토큰 전에 LineTerminator가 나타나면 세미콜론이 자동으로 삽입되고 async 토큰은 뒤따르는 토큰과 같은 표현식 또는 클래스 요소의 일부로 취급되지 않습니다.
  • async 토큰 뒤에서 * 토큰 전에 LineTerminator가 나타나면 세미콜론이 자동으로 삽입되고 구두점으로 인해 구문 오류가 발생합니다.

이에 따라 ECMAScript 프로그래머에게 실질적으로 권장되는 사항은 다음과 같습니다:

  • 후위 ++ 또는 -- 연산자는 피연산자와 같은 줄에 두어야 합니다.
  • using 선언의 BindingList는 using 토큰과 같은 줄에서 시작해야 합니다.
  • return 또는 throw 문의 Expression이나 yield 표현식의 AssignmentExpression은 return, throw 또는 yield 토큰과 같은 줄에서 시작해야 합니다.
  • break 또는 continue 문의 LabelIdentifier는 break 또는 continue 토큰과 같은 줄에 있어야 합니다.
  • 화살표 함수 매개변수의 끝과 =>는 같은 줄에 있어야 합니다.
  • 비동기 함수 또는 메서드 앞의 async 토큰은 바로 뒤의 토큰과 같은 줄에 있어야 합니다.

12.10.2 자동 세미콜론 삽입의 예

이 절은 비규범적입니다.

다음 소스

{ 1 2 } 3

는 자동 세미콜론 삽입 규칙을 적용해도 ECMAScript 문법에서 유효한 문장이 아닙니다. 반면 다음 소스

{ 1
2 } 3

역시 유효한 ECMAScript 문장은 아니지만 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

{ 1
;2 ;} 3;

이는 유효한 ECMAScript 문장입니다.

다음 소스

for (a; b
)

는 유효한 ECMAScript 문장이 아니며 세미콜론이 for 문의 헤더에 필요하므로 자동 세미콜론 삽입에 의해 변경되지 않습니다. 자동 세미콜론 삽입은 for 문의 헤더에 있는 두 세미콜론 중 하나를 절대로 삽입하지 않습니다.

다음 소스

return
a + b

는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

return;
a + b;
참고 1

LineTerminator가 표현식 a + b와 토큰 return을 분리하므로 표현식 a + b는 return 문이 반환할 값으로 취급되지 않습니다.

다음 소스

a = b
++c

는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

a = b;
++c;
참고 2

b와 ++ 사이에 LineTerminator가 있으므로 토큰 ++는 변수 b에 적용되는 후위 연산자로 취급되지 않습니다.

다음 소스

if (a > b)
else c = d

는 유효한 ECMAScript 문장이 아니며 해당 지점에서 문법의 어떤 생성 규칙도 적용되지 않지만 자동으로 삽입된 세미콜론이 빈 문으로 파싱되므로 else 토큰 앞에 자동 세미콜론을 삽입해도 변경되지 않습니다.

다음 소스

a = b + c
(d + e).print()

는 자동 세미콜론 삽입에 의해 변환되지 않습니다. 두 번째 줄을 시작하는 괄호로 둘러싸인 표현식을 함수 호출의 인수 목록으로 해석할 수 있기 때문입니다:

a = b + c(d + e).print()

할당문이 여는 괄호로 시작해야 하는 경우 프로그래머는 자동 세미콜론 삽입에 의존하는 대신 이전 문의 끝에 명시적인 세미콜론을 작성하는 것이 좋습니다.

12.10.3 자동 세미콜론 삽입의 흥미로운 사례

이 절은 비규범적입니다.

ECMAScript 프로그램은 자동 세미콜론 삽입에 의존하여 세미콜론을 거의 사용하지 않는 스타일로 작성할 수 있습니다. 위에서 설명했듯이 모든 개행에 세미콜론이 삽입되는 것은 아니며 자동 세미콜론 삽입은 줄 종결자를 사이에 둔 여러 토큰에 의존할 수 있습니다.

ECMAScript에 새로운 구문 기능이 추가되면 추가 문법 생성 규칙이 도입될 수 있으며, 이로 인해 앞에서 자동 세미콜론 삽입에 의존하던 줄이 파싱될 때 다른 문법 생성 규칙으로 변경될 수 있습니다.

이 절에서는 앞에 있는 소스 텍스트에 따라 세미콜론이 삽입될 수도 있고 삽입되지 않을 수도 있는 위치의 자동 세미콜론 삽입을 흥미로운 사례로 간주합니다. 이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 자동 세미콜론 삽입의 여러 흥미로운 사례를 설명합니다.

12.10.3.1 Statement List에서 자동 세미콜론 삽입의 흥미로운 사례

StatementList에서는 많은 StatementListItem이 세미콜론으로 끝나며, 이러한 세미콜론은 자동 세미콜론 삽입을 사용하여 생략할 수 있습니다. 위 규칙의 결과로 표현식을 끝내는 줄의 끝에서는 다음 줄이 다음 중 하나로 시작하면 세미콜론이 필요합니다:

  • 여는 괄호((). 세미콜론이 없으면 두 줄을 함께 CallExpression으로 취급합니다.
  • 여는 대괄호([). 세미콜론이 없으면 두 줄을 함께 ArrayLiteral 또는 ArrayAssignmentPattern이 아니라 프로퍼티 접근으로 취급합니다.
  • 템플릿 리터럴(`). 세미콜론이 없으면 두 줄을 함께 이전 표현식을 MemberExpression로 하는 태그된 Template(13.3.11)로 해석합니다.
  • 단항 + 또는 -. 세미콜론이 없으면 두 줄을 함께 대응하는 이항 연산자의 사용으로 해석합니다.
  • RegExp 리터럴. 세미콜론이 없으면 예를 들어 RegExp에 플래그가 있는 경우 두 줄을 대신 / MultiplicativeOperator로 파싱할 수 있습니다.

12.10.3.2 자동 세미콜론 삽입과 “[no LineTerminator here]” 사례

이 절은 비규범적입니다.

ECMAScript에는 “[no LineTerminator here]”를 포함하는 문법 생성 규칙이 있습니다. 이러한 생성 규칙은 때때로 문법에서 선택적 피연산자를 제공하는 수단입니다. 이러한 위치에 LineTerminator를 도입하면 선택적 피연산자가 없는 문법 생성 규칙을 사용하게 되어 소스 텍스트의 문법 생성 규칙이 변경됩니다.

이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 “[no LineTerminator here]”를 사용하는 여러 생성 규칙을 설명합니다.

12.10.3.2.1 선택적 피연산자와 “[no LineTerminator here]”를 갖는 문법 생성 규칙 목록