페이지 표시 설정

11 ECMAScript 언어: 소스 텍스트

11.1 소스 텍스트

구문

SourceCharacter :: any Unicode code point

ECMAScript 소스 텍스트는 유니코드 코드 포인트의 시퀀스입니다. 서로게이트 코드 포인트를 포함하여 U+0000부터 U+10FFFF까지의 모든 유니코드 코드 포인트 값은 ECMAScript 문법에서 허용되는 위치의 ECMAScript 소스 텍스트에 나타날 수 있습니다. ECMAScript 소스 텍스트를 저장하고 교환하는 데 실제로 사용되는 인코딩은 이 명세와 관련이 없습니다. 외부 소스 텍스트 인코딩과 관계없이 적합한 ECMAScript 구현체는 소스 텍스트를 각 SourceCharacter가 하나의 유니코드 코드 포인트인 동등한 SourceCharacter 값의 시퀀스인 것처럼 처리합니다. 적합한 ECMAScript 구현체는 소스 텍스트를 정규화하거나 소스 텍스트를 정규화하는 것처럼 동작할 필요가 없습니다.

결합 문자 시퀀스의 구성 요소는 사용자가 전체 시퀀스를 하나의 문자로 생각할 수 있더라도 개별 유니코드 코드 포인트로 처리됩니다.

참고

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

ECMAScript는 유니코드 이스케이프 시퀀스의 동작에서 Java 프로그래밍 언어와 다릅니다. 예를 들어 Java 프로그램에서 유니코드 이스케이프 시퀀스 \u000A가 한 줄 주석 안에 나타나면 줄 종결자로 해석되며(유니코드 코드 포인트 U+000A는 LINE FEED (LF)입니다), 따라서 다음 코드 포인트는 주석의 일부가 아닙니다. 마찬가지로 Java 프로그램의 문자열 리터럴 안에 유니코드 이스케이프 시퀀스 \u000A가 나타나면 역시 줄 종결자로 해석되며 문자열 리터럴 안에서는 허용되지 않습니다. 따라서 문자열 리터럴 값의 일부로 LINE FEED (LF)를 포함하려면 \u000A 대신 \n을 작성해야 합니다. ECMAScript 프로그램에서는 주석 안에 나타나는 유니코드 이스케이프 시퀀스를 절대로 해석하지 않으므로 주석 종료에 영향을 줄 수 없습니다. 마찬가지로 ECMAScript 프로그램의 문자열 리터럴 안에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴에 기여하며 줄 종결자 또는 문자열 리터럴을 종료할 수 있는 코드 포인트로 해석되지 않습니다.

11.1.1 Static Semantics: UTF16EncodeCodePoint ( codePoint )

추상 연산 UTF16EncodeCodePoint. 인수 codePoint (유니코드 코드 포인트). 반환값: String. 호출되면 다음 단계를 수행한다.

  1. 단언: 0 ≤ codePoint ≤ 0x10FFFF입니다.
  2. codePoint ≤ 0xFFFF이면, 숫자 값이 codePoint인 코드 단위로 구성된 String 값을 반환합니다.
  3. cu1을 숫자 값이 floor((codePoint - 0x10000) / 0x400) + 0xD800인 코드 단위로 둡니다.
  4. cu2를 숫자 값이 ((codePoint - 0x10000) modulo 0x400) + 0xDC00인 코드 단위로 둡니다.
  5. cu1과 cu2의 문자열 연결을 반환합니다.

11.1.2 Static Semantics: CodePointsToString ( text )

추상 연산 CodePointsToString. 인수 text (a sequence of Unicode code points). 반환값: String. 6.1.4에 설명된 대로 text를 String 값으로 변환합니다. 호출되면 다음 단계를 수행한다.

  1. result를 빈 String으로 둡니다.
  2. text의 각 코드 포인트 codePoint에 대해 다음을 수행합니다.
    1. result를 result와 UTF16EncodeCodePoint(codePoint)의 문자열 연결로 설정합니다.
  3. result를 반환합니다.

11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )

추상 연산 UTF16SurrogatePairToCodePoint. 인수 lead (코드 단위) 및 trail (코드 단위). 반환값: 코드 포인트. UTF-16 서로게이트 쌍을 구성하는 두 코드 단위를 하나의 코드 포인트로 변환합니다. 호출되면 다음 단계를 수행한다.

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

11.1.4 Static Semantics: CodePointAt ( string, position )

추상 연산 CodePointAt. 인수 string (String) 및 position (음이 아닌 정수). 반환값: 레코드 (필드: [[CodePoint]] (코드 포인트), [[CodeUnitCount]] (양의 정수), [[IsUnpairedSurrogate]] (Boolean)). 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 코드 포인트의 시퀀스로 해석하고 인덱스 position의 코드 단위에서 시작하는 하나의 코드 포인트를 읽습니다. 호출되면 다음 단계를 수행한다.

  1. size를 string의 길이로 둡니다.
  2. 단언: position ≥ 0이고 position < size입니다.
  3. first를 string 내 인덱스 position의 코드 단위로 둡니다.
  4. codePoint를 숫자 값이 first의 숫자 값인 코드 포인트로 둡니다.
  5. first가 선행 서로게이트도 후행 서로게이트도 아니면, 다음을 수행합니다.
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }를 반환합니다.
  6. first가 후행 서로게이트이거나 position + 1 = size이면, 다음을 수행합니다.
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }를 반환합니다.
  7. second를 string 내 인덱스 position + 1의 코드 단위로 둡니다.
  8. second가 후행 서로게이트가 아니면, 다음을 수행합니다.
    1. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }를 반환합니다.
  9. codePoint를 UTF16SurrogatePairToCodePoint(first, second)로 설정합니다.
  10. Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }를 반환합니다.

11.1.5 Static Semantics: StringToCodePoints ( string )

추상 연산 StringToCodePoints. 인수 string (String). 반환값: 리스트 (요소: 코드 포인트). 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 유니코드 텍스트로 해석하여 얻은 유니코드 코드 포인트의 시퀀스를 반환합니다. 호출되면 다음 단계를 수행한다.

  1. codePoints를 새로운 빈 List로 둡니다.
  2. size를 string의 길이로 둡니다.
  3. position을 0으로 둡니다.
  4. position < size인 동안 다음을 반복합니다.
    1. codePoint를 CodePointAt(string, position)으로 둡니다.
    2. codePoint.[[CodePoint]]를 codePoints에 추가합니다.
    3. position을 position + codePoint.[[CodeUnitCount]]로 설정합니다.
  5. codePoints를 반환합니다.

11.1.6 Static Semantics: ParseText ( sourceText, goalSymbol )

추상 연산 ParseText. 인수 sourceText ((String 또는 a sequence of Unicode code points)) 및 goalSymbol (a nonterminal in one of the ECMAScript grammars). 반환값: (구문 분석 노드 또는 a non-empty List of SyntaxError objects). 호출되면 다음 단계를 수행한다.

  1. sourceText가 String이면 sourceText를 StringToCodePoints(sourceText)로 설정합니다.
  2. goalSymbol을 목표 기호로 사용하여 sourceText의 파싱을 시도하고 파싱 결과에서 모든 조기 오류 조건을 분석합니다. 구현체는 구현체 정의 방식으로 파싱과 조기 오류 감지를 서로 교차하여 수행할 수 있습니다.
  3. 파싱에 성공하고 조기 오류가 발견되지 않았으면 파싱 결과로 생성된 파스 트리의 루트에 있는 Parse Node(goalSymbol의 인스턴스)를 반환합니다.
  4. 파싱 오류 및/또는 조기 오류를 나타내는 하나 이상의 SyntaxError 객체의 List를 반환합니다. 파싱 오류 또는 조기 오류가 둘 이상 존재하면 목록에 포함되는 오류 객체의 수와 순서는 구현체 정의이지만 최소 하나는 존재해야 합니다.
참고 1

특정 지점에 조기 오류가 있고 그보다 뒤 지점에 구문 오류도 있는 텍스트를 생각해 보시기 바랍니다. 파싱 패스를 수행한 뒤 조기 오류 패스를 수행하는 구현체는 구문 오류를 보고하고 조기 오류 패스로 진행하지 않을 수 있습니다. 두 작업을 서로 교차하여 수행하는 구현체는 조기 오류를 보고하고 구문 오류를 찾기 위한 작업을 진행하지 않을 수 있습니다. 세 번째 구현체는 두 오류를 모두 보고할 수 있습니다. 이러한 동작은 모두 적합합니다.

참고 2

17 절도 참조하시기 바랍니다.

11.2 소스 코드의 타입

ECMAScript 코드에는 네 가지 타입이 있습니다:

참고 1

함수 코드는 일반적으로 함수 정의(15.2), 화살표 함수 정의(15.3), 메서드 정의(15.4), 제너레이터 함수 정의(15.5), 비동기 함수 정의(15.8), 비동기 제너레이터 함수 정의(15.6) 및 비동기 화살표 함수(15.9)의 본문으로 제공됩니다. 함수 코드는 Function 생성자(20.2.1.1), GeneratorFunction 생성자(27.6.1.1), AsyncFunction 생성자(27.10.1.1) 및 AsyncGeneratorFunction 생성자(27.7.1.1)의 인수에서도 파생됩니다.

참고 2

함수 코드에 BindingIdentifier를 포함하는 실질적인 효과는 둘러싸는 코드가 엄격 모드 코드가 아니더라도 본문에 Use Strict 지시문가 포함된 함수의 이름인 BindingIdentifier에 엄격 모드 코드의 조기 오류가 적용된다는 것입니다.

11.2.1 지시문 프롤로그와 Use Strict 지시문

지시문 프롤로그는 FunctionBody, ScriptBody 또는 ModuleBody의 처음 StatementListItem 또는 ModuleItem으로 나타나는 ExpressionStatement 중 각 ExpressionStatement가 전체적으로 StringLiteral 토큰과 그 뒤의 세미콜론으로만 구성된 가장 긴 시퀀스입니다. 세미콜론은 명시적으로 나타나거나 자동 세미콜론 삽입(12.10)에 의해 삽입될 수 있습니다. 지시문 프롤로그는 빈 시퀀스일 수 있습니다.

Use Strict 지시문은 지시문 프롤로그 안에서 StringLiteral이 정확한 코드 포인트 시퀀스 "use strict" 또는 'use strict' 중 하나인 ExpressionStatement입니다. Use Strict 지시문에는 EscapeSequence 또는 LineContinuation을 포함할 수 없습니다.

지시문 프롤로그에는 둘 이상의 Use Strict 지시문이 포함될 수 있습니다. 그러나 이 경우 구현체는 경고를 표시할 수 있습니다.

참고

지시문 프롤로그의 ExpressionStatement는 이를 포함하는 생성 규칙을 평가하는 동안 정상적으로 평가됩니다. 구현체는 Use Strict 지시문이 아니면서 지시문 프롤로그에 나타나는 ExpressionStatement에 구현체별 의미를 정의할 수 있습니다. 적절한 알림 메커니즘이 존재하는 경우 구현체는 지시문 프롤로그에서 Use Strict 지시문이 아니며 구현체가 정의한 의미도 없는 ExpressionStatement를 발견하면 경고를 표시해야 합니다.

11.2.2 엄격 모드 코드

ECMAScript 구문 단위는 제한 없는 모드 또는 엄격 모드 구문과 의미론(4.3.2)을 사용하여 처리할 수 있습니다. 다음 상황에서 코드는 엄격 모드 코드로 해석됩니다:

엄격 모드 코드가 아닌 ECMAScript 코드를 비엄격 코드라고 합니다.

11.2.2.1 Static Semantics: IsStrict ( parseNode )

추상 연산 IsStrict. 인수 parseNode (구문 분석 노드). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. parseNode와 일치하는 소스 텍스트가 엄격 모드 코드이면, true를 반환합니다.
  2. false를 반환합니다.

11.2.3 비ECMAScript 함수

ECMAScript 구현체는 ECMAScript 소스 텍스트가 아닌 호스트 정의 형식의 실행 가능 코드로 평가 동작이 표현되는 함수 특수 객체의 평가를 지원할 수 있습니다. 함수 객체가 ECMAScript 코드 안에서 정의되었는지 또는 내장 함수인지는 이러한 함수 객체를 호출하거나 이러한 함수 객체에 의해 호출되는 ECMAScript 코드의 관점에서는 관찰할 수 없습니다.