11 ECMAScript 언어: 소스 텍스트(ECMAScript Language: Source Text)

11.1 소스 텍스트(Source Text)

Syntax

SourceCharacter :: any Unicode code point

ECMAScript source text는 유니코드 코드 포인트들의 시퀀스이다. ECMAScript 문법이 허용하는 위치에서는 U+0000 부터 U+10FFFF 까지의 모든 유니코드 코드 포인트 값(서러게이트 코드 포인트 포함)이 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장·교환하는 실제 인코딩은 이 명세와 무관하다. 외부 소스 텍스트 인코딩이 무엇이든, 적합한 ECMAScript 구현은 소스 텍스트를 동등한 SourceCharacter 값들의 시퀀스로 처리하며, 각 SourceCharacter 는 하나의 유니코드 코드 포인트이다. 적합한 ECMAScript 구현은 소스 텍스트에 대해 어떤 정규화(normalization)를 수행할 필요도 없으며 정규화를 수행하는 것처럼 동작할 필요도 없다.

결합 문자 시퀀스(combining character sequence)의 구성 요소들은 사용자가 전체를 단일 문자로 생각할지라도 개별 유니코드 코드 포인트로 취급된다.

Note

문자열 리터럴, 정규 표현식 리터럴, 템플릿 리터럴 및 식별자에서 모든 유니코드 코드 포인트는 해당 코드 포인트의 수치 값을 명시적으로 표현하는 유니코드 이스케이프 시퀀스로도 표현할 수 있다. 주석 안에서는 그러한 이스케이프 시퀀스는 주석 일부로서 사실상 무시된다.

ECMAScript 는 유니코드 이스케이프 시퀀스 동작에서 Java 프로그래밍 언어와 다르다. 예를 들어 Java 프로그램에서 유니코드 이스케이프 시퀀스 \u000A 가 단일 행 주석 내에 나타나면 그것은 행 종결자(유니코드 코드 포인트 U+000A 는 LINE FEED (LF))로 해석되어 다음 코드 포인트는 더 이상 주석의 일부가 아니다. 마찬가지로 Java 프로그램의 문자열 리터럴에 \u000A 가 나타나면 그것 역시 행 종결자로 해석되며 문자열 리터럴 내부에는 허용되지 않는다—문자열 값에 LINE FEED (LF)를 포함하려면 \u000A 대신 \n 을 써야 한다. ECMAScript 프로그램에서는 주석 내부에 나타나는 유니코드 이스케이프 시퀀스가 절대 해석되지 않으며 따라서 주석 종료에 기여할 수 없다. 유사하게 ECMAScript 프로그램의 문자열 리터럴 내부에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴의 일부로 기여하고 결코 행 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.

11.1.1 정적 의미론(Static Semantics): UTF16EncodeCodePoint ( cp: a Unicode code point, ): a String

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. 단언: 0 ≤ cp ≤ 0x10FFFF.
  2. cp ≤ 0xFFFF 이면, 수치 값이 cp 인 코드 유닛으로 구성된 String 값을 반환한다.
  3. cu1 를 수치 값이 floor((cp - 0x10000) / 0x400) + 0xD800 인 코드 유닛으로 둔다.
  4. cu2 를 수치 값이 ((cp - 0x10000) modulo 0x400) + 0xDC00 인 코드 유닛으로 둔다.
  5. cu1cu2 의 문자열 연결(string-concatenation)을 반환한다.

11.1.2 정적 의미론(Static Semantics): CodePointsToString ( text: a sequence of Unicode code points, ): a String

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 이는 6.1.4 에 설명된 대로 text 를 String 값으로 변환한다. It performs the following steps when called:

  1. result 를 빈 문자열로 둔다.
  2. text 의 각 코드 포인트 cp 에 대해
    1. resultresult 와 UTF16EncodeCodePoint(cp) 의 문자열 연결로 설정한다.
  3. result 를 반환한다.

11.1.3 정적 의미론(Static Semantics): UTF16SurrogatePairToCodePoint ( lead: a code unit, trail: a code unit, ): a code point

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. UTF-16 서로게이트 쌍을 이루는 두 코드 유닛을 코드 포인트로 변환한다. It performs the following steps when called:

  1. 단언: lead 는 선행 서로게이트이고 trail 은 후행 서로게이트이다.
  2. cp 를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 으로 둔다.
  3. 코드 포인트 cp 를 반환한다.

11.1.4 정적 의미론(Static Semantics): CodePointAt ( string: a String, position: a non-negative integer, ): a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean)

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 6.1.4 에 설명된 대로 string 을 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하고, 인덱스 position 에 있는 코드 유닛에서 시작하는 단일 코드 포인트를 읽는다. It performs the following steps when called:

  1. sizestring 길이로 둔다.
  2. 단언: position ≥ 0 그리고 position < size.
  3. firststring 내 인덱스 position 의 코드 유닛으로 둔다.
  4. cp 를 수치 값이 first 의 수치 값인 코드 포인트로 둔다.
  5. first 가 선행 서로게이트도 후행 서로게이트도 아니면
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false } 를 반환한다.
  6. first 가 후행 서로게이트이거나 position + 1 = size 이면
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } 를 반환한다.
  7. secondstring 내 인덱스 position + 1 의 코드 유닛으로 둔다.
  8. second 가 후행 서로게이트가 아니면
    1. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } 를 반환한다.
  9. cp 를 UTF16SurrogatePairToCodePoint(first, second) 로 설정한다.
  10. Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false } 를 반환한다.

11.1.5 정적 의미론(Static Semantics): StringToCodePoints ( string: a String, ): a List of code points

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 6.1.4 에 설명된 대로 string 을 UTF-16 인코딩된 유니코드 텍스트로 해석하여 얻어지는 유니코드 코드 포인트 시퀀스를 반환한다. It performs the following steps when called:

  1. codePoints 를 새 빈 List 로 둔다.
  2. sizestring 길이로 둔다.
  3. position 을 0 으로 둔다.
  4. position < size 인 동안 반복,
    1. cp 를 CodePointAt(string, position) 로 둔다.
    2. cp.[[CodePoint]]codePoints 에 추가한다.
    3. positionposition + cp.[[CodeUnitCount]] 로 설정한다.
  5. codePoints 를 반환한다.

11.1.6 정적 의미론(Static Semantics): ParseText ( sourceText: a String or a sequence of Unicode code points, goalSymbol: a nonterminal in one of the ECMAScript grammars, ): a Parse Node or a non-empty List of SyntaxError objects

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. sourceText 가 String 이면 sourceText 를 StringToCodePoints(sourceText) 로 설정한다.
  2. goalSymbol 을 목표 심볼(goal symbol)로 사용하여 sourceText 를 파싱하고, 파싱 결과를 조기 오류(early error) 조건이 있는지 분석한다. 파싱과 조기 오류 검출은 구현 정의 방식으로 상호 교차(interleaved)될 수 있다.
  3. 파싱이 성공했고 조기 오류가 발견되지 않았다면, 파싱에서 생성된 파스 트리의 루트에 있는 Parse Node ( goalSymbol 의 인스턴스) 를 반환한다.
  4. 그렇지 않으면, 파싱 오류 및/또는 조기 오류를 나타내는 하나 이상의 SyntaxError 객체들의 List 를 반환한다. 둘 이상의 파싱 오류 또는 조기 오류가 있을 경우, 리스트 내 오류 객체의 수와 순서는 구현 정의이지만 최소 하나는 있어야 한다.
Note 1

특정 지점에 조기 오류가 있고 이후 지점에 구문 오류가 있는 텍스트를 생각해보자. 파싱 후 조기 오류 패스를 수행하는 구현은 구문 오류를 보고하고 조기 오류 패스로 진행하지 않을 수 있다. 두 활동을 교차 수행하는 구현은 조기 오류를 보고하고 구문 오류 탐지를 진행하지 않을 수 있다. 세 번째 구현은 두 오류를 모두 보고할 수 있다. 이 모든 동작은 적합하다.

Note 2

17 절도 참조.

11.2 소스 코드의 유형(Types of Source Code)

ECMAScript 코드는 네 가지 유형이 있다:

Note 1

Function code 는 일반적으로 Function Definitions (15.2), Arrow Function Definitions (15.3), Method Definitions (15.4), Generator Function Definitions (15.5), Async Function Definitions (15.8), Async Generator Function Definitions (15.6), Async Arrow Functions (15.9) 의 본문으로 제공된다. Function code 는 또한 Function 생성자 (20.2.1.1), GeneratorFunction 생성자 (27.3.1.1), AsyncFunction 생성자 (27.7.1.1), AsyncGeneratorFunction 생성자 (27.4.1.1) 의 인자에서 파생된다.

Note 2

function code 에 BindingIdentifier 를 포함하는 실질적 효과는 주변 코드가 strict 모드 코드가 아니더라도 함수 본문에 "use strict" 지시문을 포함하는 함수 이름인 BindingIdentifier 에 strict 모드 코드의 Early Errors 가 적용되게 한다.

11.2.1 지시문 프로로그와 Use Strict 지시문(Directive Prologues and the Use Strict Directive)

Directive PrologueFunctionBody, ScriptBody, 또는 ModuleBody 의 처음 StatementListItem 들 또는 ModuleItem 들로 발생하는 ExpressionStatement 들의 가장 긴 시퀀스로서, 그 시퀀스의 각 ExpressionStatement 가 완전히 StringLiteral 토큰 뒤에 세미콜론이 따라오는 형태로만 구성된다. 세미콜론은 명시적으로 나타나거나 자동 세미콜론 삽입(12.10)에 의해 삽입될 수 있다. Directive Prologue 는 빈 시퀀스일 수 있다.

Use Strict DirectiveStringLiteral 이 정확히 "use strict" 또는 'use strict' 코드 포인트 시퀀스인 Directive Prologue 내의 ExpressionStatement 이다. Use Strict DirectiveEscapeSequence 또는 LineContinuation 을 포함할 수 없다.

Directive Prologue 는 둘 이상의 Use Strict Directive 를 포함할 수 있다. 단, 구현은 이 경우 경고를 발행할 수 있다.

Note

Directive PrologueExpressionStatement 들은 포함하는 생성물(production)을 평가하는 동안 정상적으로 평가된다. 구현은 Use Strict Directive 가 아니면서 Directive Prologue 에 등장하는 ExpressionStatement 에 대해 구현별 의미를 정의할 수 있다. 적절한 통지 메커니즘이 존재한다면, 구현은 Directive Prologue 에서 Use Strict Directive 가 아니고 구현이 정의한 의미도 가지지 않는 ExpressionStatement 를 발견할 경우 경고를 발행해야 한다.

11.2.2 Strict 모드 코드(Strict Mode Code)

ECMAScript 구문 단위는 비제한(unrestricted) 또는 strict 모드 문법과 의미론(4.3.2)을 사용하여 처리될 수 있다. 다음 상황에서 코드는 strict mode code 로 해석된다:

strict mode code 가 아닌 ECMAScript 코드는 non-strict code 라고 한다.

11.2.2.1 정적 의미론(Static Semantics): IsStrict ( node: a Parse Node, ): a Boolean

The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:

  1. node 가 매치한 소스 텍스트가 strict mode code 이면 true 반환; 그렇지 않으면 false 반환.

11.2.3 비 ECMAScript 함수(Non-ECMAScript Functions)

ECMAScript 구현은 평가 동작이 ECMAScript 소스 텍스트가 아닌 호스트 정의 실행 가능 코드 형태로 표현된 함수 이그조틱 객체의 평가를 지원할 수 있다. 함수 객체가 ECMAScript 코드 내에서 정의되었는지 또는 내장 함수인지 여부는 그러한 함수 객체를 호출하거나 그에 의해 호출되는 ECMAScript 코드의 관점에서는 관측할 수 없다.