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. 호출되면 다음 단계를 수행한다.
- 단언: 0 ≤ codePoint ≤ 0x10FFFF입니다.
- codePoint ≤ 0xFFFF이면, 숫자 값이 codePoint인 코드 단위로 구성된 String 값을 반환합니다.
- cu1을 숫자 값이 floor((codePoint - 0x10000) / 0x400) + 0xD800인 코드 단위로 둡니다.
- cu2를 숫자 값이 ((codePoint - 0x10000) modulo 0x400) + 0xDC00인 코드 단위로 둡니다.
- cu1과 cu2의 문자열 연결을 반환합니다.
11.1.2 Static Semantics: CodePointsToString ( text )
추상 연산 CodePointsToString. 인수 text (a sequence of Unicode code points). 반환값: String. 6.1.4에 설명된 대로 text를 String 값으로 변환합니다. 호출되면 다음 단계를 수행한다.
- result를 빈 String으로 둡니다.
- text의 각 코드 포인트 codePoint에 대해 다음을 수행합니다.
- result를 result와 UTF16EncodeCodePoint(codePoint)의 문자열 연결로 설정합니다.
- result를 반환합니다.
11.1.3 Static Semantics: UTF16SurrogatePairToCodePoint ( lead, trail )
추상 연산 UTF16SurrogatePairToCodePoint. 인수 lead (코드 단위) 및 trail (코드 단위). 반환값: 코드 포인트. UTF-16 서로게이트 쌍을 구성하는 두 코드 단위를 하나의 코드 포인트로 변환합니다. 호출되면 다음 단계를 수행한다.
- 단언: lead는 선행 서로게이트이고 trail은 후행 서로게이트입니다.
- codePoint를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000으로 둡니다.
- 코드 포인트 codePoint를 반환합니다.
11.1.4 Static Semantics: CodePointAt ( string, position )
추상 연산 CodePointAt. 인수 string (String) 및 position (음이 아닌 정수). 반환값: 레코드 (필드: [[CodePoint]] (코드 포인트), [[CodeUnitCount]] (양의 정수), [[IsUnpairedSurrogate]] (Boolean)). 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 코드 포인트의 시퀀스로 해석하고 인덱스 position의 코드 단위에서 시작하는 하나의 코드 포인트를 읽습니다. 호출되면 다음 단계를 수행한다.
- size를 string의 길이로 둡니다.
- 단언: position ≥ 0이고 position < size입니다.
- first를 string 내 인덱스 position의 코드 단위로 둡니다.
- codePoint를 숫자 값이 first의 숫자 값인 코드 포인트로 둡니다.
- first가 선행 서로게이트도 후행 서로게이트도 아니면, 다음을 수행합니다.
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }를 반환합니다.
- first가 후행 서로게이트이거나 position + 1 = size이면, 다음을 수행합니다.
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }를 반환합니다.
- second를 string 내 인덱스 position + 1의 코드 단위로 둡니다.
- second가 후행 서로게이트가 아니면, 다음을 수행합니다.
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }를 반환합니다.
- codePoint를 UTF16SurrogatePairToCodePoint(first, second)로 설정합니다.
- Record { [[CodePoint]]: codePoint, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }를 반환합니다.
11.1.5 Static Semantics: StringToCodePoints ( string )
추상 연산 StringToCodePoints. 인수 string (String). 반환값: 리스트 (요소: 코드 포인트). 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 유니코드 텍스트로 해석하여 얻은 유니코드 코드 포인트의 시퀀스를 반환합니다. 호출되면 다음 단계를 수행한다.
- codePoints를 새로운 빈 List로 둡니다.
- size를 string의 길이로 둡니다.
- position을 0으로 둡니다.
- position < size인 동안 다음을 반복합니다.
- codePoint를 CodePointAt(string, position)으로 둡니다.
- codePoint.[[CodePoint]]를 codePoints에 추가합니다.
- position을 position + codePoint.[[CodeUnitCount]]로 설정합니다.
- 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). 호출되면 다음 단계를 수행한다.
- sourceText가 String이면 sourceText를 StringToCodePoints(sourceText)로 설정합니다.
- goalSymbol을 목표 기호로 사용하여 sourceText의 파싱을 시도하고 파싱 결과에서 모든 조기 오류 조건을 분석합니다. 구현체는 구현체 정의 방식으로 파싱과 조기 오류 감지를 서로 교차하여 수행할 수 있습니다.
- 파싱에 성공하고 조기 오류가 발견되지 않았으면 파싱 결과로 생성된 파스 트리의 루트에 있는 Parse Node(goalSymbol의 인스턴스)를 반환합니다.
- 파싱 오류 및/또는 조기 오류를 나타내는 하나 이상의 SyntaxError 객체의 List를 반환합니다. 파싱 오류 또는 조기 오류가 둘 이상 존재하면 목록에 포함되는 오류 객체의 수와 순서는 구현체 정의이지만 최소 하나는 존재해야 합니다.
참고 1
특정 지점에 조기 오류가 있고 그보다 뒤 지점에 구문 오류도 있는 텍스트를 생각해 보시기 바랍니다. 파싱 패스를 수행한 뒤 조기 오류 패스를 수행하는 구현체는 구문 오류를 보고하고 조기 오류 패스로 진행하지 않을 수 있습니다. 두 작업을 서로 교차하여 수행하는 구현체는 조기 오류를 보고하고 구문 오류를 찾기 위한 작업을 진행하지 않을 수 있습니다. 세 번째 구현체는 두 오류를 모두 보고할 수 있습니다. 이러한 동작은 모두 적합합니다.
참고 2