?uem/p1-90`ECMAScript
어휘 입력 요소를 식별하는 방식이 해당 입력 요소를 소비하는 구문 문법 문맥에 따라 달라지는 상황이 여러 가지 있습니다. 따라서 어휘 문법에는 여러
여러 어휘 목표를 사용하면 자동 세미콜론 삽입에 영향을 주는 어휘적 모호성이 발생하지 않습니다. 예를 들어 선행 나눗셈 또는 나눗셈 할당과 선행
a = b
/hi/g.exec(c).map(d);
a = b / hi / g.exec(c).map(d);
유니코드 형식 제어 문자(즉, LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK와 같은 유니코드 문자 데이터베이스의 “Cf” 범주에 속하는 문자)는 마크업 언어와 같은 상위 수준 프로토콜이 없는 경우 일정 범위의 텍스트 형식을 제어하는 데 사용하는 제어 코드입니다.
소스 텍스트에서 형식 제어 문자를 허용하면 편집과 표시가 편리해집니다. 모든 형식 제어 문자는 주석과 문자열 리터럴, 템플릿 리터럴 및 정규 표현식 리터럴 안에서 사용할 수 있습니다.
U+FEFF (ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트 시작 부분에서 해당 텍스트가 유니코드임을 표시하고 텍스트의 인코딩과 바이트 순서를 감지할 수 있도록 하는 데 사용하는 형식 제어 문자입니다. 이러한 목적으로 사용하는 <ZWNBSP> 문자는 파일 연결 등의 결과로 텍스트 시작 부분 이후에도 나타날 수 있습니다.
공백 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(더 이상 나눌 수 없는 어휘 단위)을 서로 분리하는 데 사용되지만 그 밖에는 중요하지 않습니다. 공백 코드 포인트는 임의의 두 토큰 사이와 입력의 시작 또는 끝에 나타날 수 있습니다. 공백 코드 포인트는
ECMAScript 공백 코드 포인트는
| 코드 포인트 | 이름 | 약어 |
|---|---|---|
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> |
U+0020 (SPACE) 및 U+00A0 (NO-BREAK SPACE) 코드 포인트는 <USP>의 일부입니다.
공백 코드 포인트와 마찬가지로 줄 종결자 코드 포인트는 소스 텍스트의 가독성을 높이고 토큰(더 이상 나눌 수 없는 어휘 단위)을 서로 분리하는 데 사용됩니다. 그러나 공백 코드 포인트와 달리 줄 종결자는 구문 문법의 동작에 일부 영향을 줍니다. 일반적으로 줄 종결자는 임의의 두 토큰 사이에 나타날 수 있지만 구문 문법에 의해 금지되는 위치도 일부 있습니다. 줄 종결자는 자동 세미콜론 삽입 과정(
줄 종결자는
줄 종결자는 정규 표현식의 \s 클래스와 일치하는 공백 코드 포인트 집합에 포함됩니다.
ECMAScript 줄 종결자 코드 포인트는
| 코드 포인트 | 유니코드 이름 | 약어 |
|---|---|---|
U+000A
|
LINE FEED (LF) | <LF> |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
U+2028
|
LINE SEPARATOR | <LS> |
U+2029
|
PARAGRAPH SEPARATOR | <PS> |
생성 규칙
주석은 한 줄 또는 여러 줄일 수 있습니다. 여러 줄 주석은 중첩할 수 없습니다.
한 줄 주석에는 // 표시부터 줄 끝까지의 모든 코드 포인트로 구성됩니다. 그러나 줄 끝의
주석은 공백처럼 동작하며 버려집니다. 단,
이 절의 여러 생성 규칙에는
Hashbang 주석은 위치에 민감하며 다른 종류의 주석과 마찬가지로 구문 문법의 입력 요소 스트림에서 제거됩니다.
이 표준은 특정 코드 포인트의 추가를 명시합니다. U+0024 (DOLLAR SIGN) 및 U+005F (LOW LINE)은
비단말 기호
비단말 기호 _를 파생합니다.
유니코드 프로퍼티 “ID_Start” 및 “ID_Continue”을 갖는 코드 포인트 집합에는 각각 유니코드 프로퍼티 “Other_ID_Start” 및 “Other_ID_Continue”을 갖는 코드 포인트가 포함됩니다.
\는 어떤 코드 포인트에도 기여하지 않습니다. \
유니코드 표준에 따라 정규적으로 동등한 두
키워드는 fixed width 글꼴의 리터럴로 나타납니다. ECMAScript의 키워드에는 if, while, async, await 등이 있습니다.
예약어는 식별자로 사용할 수 없는 if와 while은 예약어입니다. await는 async 함수와 모듈 안에서만 예약됩니다. async는 예약되지 않으며 변수 이름이나 문 레이블로 제한 없이 사용할 수 있습니다.
이 명세는 문법 생성 규칙과 await와 yield를 제외하면 무조건 예약됩니다. await와 yield의 예외는 매개변수화된 구문 생성 규칙을 사용하여
Math, window, toString, _처럼 항상 식별자로 허용되며 키워드는 아닌 이름;
아래에 나열된 await와 yield를 제외하고 절대로 식별자로 허용되지 않는 이름;
문맥에 따라 식별자로 허용되는 이름, 즉 await와 yield;
let, static, implements, interface, package, private, protected, public;
항상 식별자로 허용되지만 as, async, from, get, meta, of, set, target.
조건부 키워드 또는 문맥적 키워드라는 용어는 마지막 세 범주에 속하여 일부 문맥에서는 식별자로, 다른 문맥에서는 키워드로 사용할 수 있는 키워드를 가리키는 데 사용되기도 합니다.
\
\ els\u{65}라고 작성하여 “else”라는 이름의 변수를 선언할 수는 없습니다.
enum은 현재 이 명세에서 키워드로 사용되지 않습니다. 이는 향후 언어 확장에서 키워드로 사용하기 위해 따로 예약해 둔 미래 예약어입니다.
마찬가지로 implements, interface, package, private, protected, public은
예를 들어 3in은 오류이며 두 입력 요소 3과 in이 아닙니다.
숫자 리터럴은
문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 0개 이상의 유니코드 코드 포인트입니다. 유니코드 코드 포인트는 이스케이프 시퀀스로 나타낼 수도 있습니다. 닫는 따옴표 코드 포인트, U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), U+000A (LINE FEED)를 제외한 모든 코드 포인트는 문자열 리터럴에 그대로 나타날 수 있습니다. 모든 코드 포인트는 이스케이프 시퀀스의 형태로 나타날 수 있습니다. 문자열 리터럴은 ECMAScript String 값으로 평가됩니다. 이러한 String 값을 생성할 때 유니코드 코드 포인트는
비단말 기호
<LF> 및 <CR>은 빈 코드 포인트 시퀀스를 생성하기 위한 \n 또는 \u000A와 같은 이스케이프 시퀀스를 사용하는 것입니다.
문자열 리터럴이 둘러싸는 코드를
function invalid() { "\7"; "use strict"; }
문자열 리터럴은
| 이스케이프 시퀀스 | 코드 단위 값 | 유니코드 문자 이름 | 기호 |
|---|---|---|---|
\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 |
\
|
아래 생성 규칙은 정규 표현식 리터럴의 구문을 설명하며 입력 요소 스캐너가 정규 표현식 리터럴의 끝을 찾는 데 사용합니다. 이후
구현체는
정규 표현식 리터럴은 비어 있을 수 없습니다. 빈 정규 표현식 리터럴을 나타내는 대신 코드 단위 시퀀스 //는 한 줄 주석을 시작합니다. 빈 정규 표현식을 지정하려면 /(?:)/을 사용하시기 바랍니다.
대부분의 ECMAScript 문과 선언은 세미콜론으로 끝나야 합니다. 이러한 세미콜론은 항상 소스 텍스트에 명시적으로 나타날 수 있습니다. 그러나 편의를 위해 특정 상황에서는 소스 텍스트에서 이러한 세미콜론을 생략할 수 있습니다. 이러한 상황은 해당 위치에서 소스 코드 토큰 스트림에 세미콜론이 자동으로 삽입된다고 설명합니다.
다음 규칙에서 “토큰”은
세미콜론 삽입에는 세 가지 기본 규칙이 있습니다:
소스 텍스트를 왼쪽에서 오른쪽으로 파싱하는 동안 문법의 어떤 생성 규칙에서도 허용되지 않는 토큰(문제 토큰이라고 합니다)을 만났을 때 다음 조건 중 하나 이상이 참이면 문제 토큰 앞에 세미콜론이 자동으로 삽입됩니다:
}입니다.
)이고 삽입된 세미콜론이 do-while 문(그러나 앞의 규칙에는 이를 우선하는 추가 조건이 있습니다. 삽입된 세미콜론이 빈 문으로 파싱되거나 for 문의 헤더에 있는 두 세미콜론 중 하나가 되는 경우(
문법에서 제한된 생성 규칙은 다음뿐입니다:
이러한 제한된 생성 규칙의 실질적인 효과는 다음과 같습니다:
++ 또는 -- 토큰을 만났고 이전 토큰과 ++ 또는 -- 토큰 사이에 최소 하나의 ++ 또는 -- 토큰 앞에 세미콜론이 자동으로 삽입됩니다.
using 토큰을 만났고 using 토큰 뒤에 세미콜론이 자동으로 삽입됩니다.
continue, break, return, throw 또는 yield 토큰을 만났고 다음 토큰 전에 continue, break, return, throw 또는 yield 토큰 뒤에 세미콜론이 자동으로 삽입됩니다.
=> 토큰 전에 async 토큰 뒤에서 function, ( 토큰 전에 async 토큰은 뒤따르는 토큰과 같은 표현식 또는 클래스 요소의 일부로 취급되지 않습니다.
async 토큰 뒤에서 * 토큰 전에 이에 따라 ECMAScript 프로그래머에게 실질적으로 권장되는 사항은 다음과 같습니다:
++ 또는 -- 연산자는 피연산자와 같은 줄에 두어야 합니다.
using 선언의 using 토큰과 같은 줄에서 시작해야 합니다.
return 또는 throw 문의 yield 표현식의 return, throw 또는 yield 토큰과 같은 줄에서 시작해야 합니다.
break 또는 continue 문의 break 또는 continue 토큰과 같은 줄에 있어야 합니다.
=>는 같은 줄에 있어야 합니다.
async 토큰은 바로 뒤의 토큰과 같은 줄에 있어야 합니다.
다음 소스
{ 1 2 } 3
는 자동 세미콜론 삽입 규칙을 적용해도 ECMAScript 문법에서 유효한 문장이 아닙니다. 반면 다음 소스
{ 1
2 } 3
역시 유효한 ECMAScript 문장은 아니지만 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
{ 1
;2 ;} 3;
이는 유효한 ECMAScript 문장입니다.
다음 소스
for (a; b
)
는 유효한 ECMAScript 문장이 아니며 세미콜론이 for 문의 헤더에 필요하므로 자동 세미콜론 삽입에 의해 변경되지 않습니다. 자동 세미콜론 삽입은 for 문의 헤더에 있는 두 세미콜론 중 하나를 절대로 삽입하지 않습니다.
다음 소스
return
a + b
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
return;
a + b;
a + b와 토큰 return을 분리하므로 표현식 a + b는 return 문이 반환할 값으로 취급되지 않습니다.
다음 소스
a = b
++c
는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:
a = b;
++c;
b와 ++ 사이에 ++는 변수 b에 적용되는 후위 연산자로 취급되지 않습니다.
다음 소스
if (a > b)
else c = d
는 유효한 ECMAScript 문장이 아니며 해당 지점에서 문법의 어떤 생성 규칙도 적용되지 않지만 자동으로 삽입된 세미콜론이 빈 문으로 파싱되므로 else 토큰 앞에 자동 세미콜론을 삽입해도 변경되지 않습니다.
다음 소스
a = b + c
(d + e).print()
는 자동 세미콜론 삽입에 의해 변환되지 않습니다. 두 번째 줄을 시작하는 괄호로 둘러싸인 표현식을 함수 호출의 인수 목록으로 해석할 수 있기 때문입니다:
a = b + c(d + e).print()
할당문이 여는 괄호로 시작해야 하는 경우 프로그래머는 자동 세미콜론 삽입에 의존하는 대신 이전 문의 끝에 명시적인 세미콜론을 작성하는 것이 좋습니다.
ECMAScript 프로그램은 자동 세미콜론 삽입에 의존하여 세미콜론을 거의 사용하지 않는 스타일로 작성할 수 있습니다. 위에서 설명했듯이 모든 개행에 세미콜론이 삽입되는 것은 아니며 자동 세미콜론 삽입은 줄 종결자를 사이에 둔 여러 토큰에 의존할 수 있습니다.
ECMAScript에 새로운 구문 기능이 추가되면 추가 문법 생성 규칙이 도입될 수 있으며, 이로 인해 앞에서 자동 세미콜론 삽입에 의존하던 줄이 파싱될 때 다른 문법 생성 규칙으로 변경될 수 있습니다.
이 절에서는 앞에 있는 소스 텍스트에 따라 세미콜론이 삽입될 수도 있고 삽입되지 않을 수도 있는 위치의 자동 세미콜론 삽입을 흥미로운 사례로 간주합니다. 이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 자동 세미콜론 삽입의 여러 흥미로운 사례를 설명합니다.
(). 세미콜론이 없으면 두 줄을 함께 [). 세미콜론이 없으면 두 줄을 함께 `). 세미콜론이 없으면 두 줄을 함께 이전 표현식을 + 또는 -. 세미콜론이 없으면 두 줄을 함께 대응하는 이항 연산자의 사용으로 해석합니다./ ECMAScript에는 “[no
이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 “[no