?um/p1-90`ECMAScript
어휘 입력 요소의 식별이 입력 요소를 소비하는 구문 문법 문맥에 민감한 여러 상황이 있다. 이 때문에 어휘 문법에는 여러 goal symbol이 필요하다.
여러 어휘 goal을 사용하는 것은 자동 세미콜론 삽입에 영향을 줄 수 있는 어휘적 모호성이 없도록 보장한다. 예를 들어, 선행 division 또는 division-assignment와 선행
a = b
/hi/g.exec(c).map(d);
a = b / hi / g.exec(c).map(d);
유니코드 형식 제어 문자(즉, LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK와 같은 Unicode Character Database의 “Cf” 범주에 속하는 문자)는, 상위 수준 프로토콜(예: 마크업 언어)이 없는 상황에서 텍스트 범위의 형식을 제어하는 데 사용되는 제어 코드이다.
편집과 표시를 용이하게 하기 위해 소스 텍스트에서 형식 제어 문자를 허용하는 것이 유용하다. 모든 형식 제어 문자는 주석 안에서, 그리고 문자열 리터럴, 템플릿 리터럴, 정규식 리터럴 안에서 사용할 수 있다.
U+FEFF (ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트 시작 부분에서 그것이 Unicode임을 표시하고 텍스트의 인코딩 및 바이트 순서를 감지할 수 있도록 하는 데 사용되는 형식 제어 문자이다. 이런 목적의 <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> |
| general category “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> |
주석은 단일 행 또는 여러 행일 수 있다. 여러 행 주석은 중첩될 수 없다.
단일 행 주석은 // 표시부터 줄 끝까지의 모든 코드 포인트로 구성된다. 그러나 줄 끝의
주석은 공백처럼 동작하며 버려지지만,
이 절의 여러 production에는
Hashbang 주석은 위치에 민감하며, 다른 종류의 주석과 마찬가지로 구문 문법을 위한 입력 요소 스트림에서 버려진다.
이 표준은 특정 코드 포인트 추가를 명시한다: U+0024 (DOLLAR SIGN)와 U+005F (LOW LINE)는
비단말
비단말 _를 도출한다.
유니코드 속성 “ID_Start”와 “ID_Continue”를 가진 코드 포인트 집합은 각각 유니코드 속성 “Other_ID_Start”와 “Other_ID_Continue”를 가진 코드 포인트를 포함한다.
유니코드 이스케이프 시퀀스는 \는 어떤 코드 포인트도 기여하지 않는다. \
Unicode Standard에 따라 canonical equivalent한 두
The syntax-directed operation IdentifierCodePoints takes no arguments and returns a
The syntax-directed operation IdentifierCodePoint takes no arguments and returns a code point. It is defined piecewise over the following productions:
키워드는 fixed width 글꼴로 문자 그대로 나타난다. ECMAScript의 키워드에는 if, while, async, await 등 많은 것들이 포함된다.
예약어는 식별자로 사용할 수 없는 if와 while은 예약어이다. await는 async 함수와 모듈 내부에서만 예약된다. async는 예약어가 아니다; 제한 없이 변수 이름이나 문장 라벨로 사용할 수 있다.
이 명세는 문법 production과 early error 규칙의 조합을 사용하여 어떤 이름이 유효한 식별자이고 어떤 이름이 예약어인지 명시한다. 아래 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이 아니다.
숫자 리터럴은
The syntax-directed operation NumericValue takes no arguments and returns a Number or a BigInt. It is defined piecewise over the following productions:
문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 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"; }
The syntax-directed operation SV takes no arguments and returns a 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 |
\
|
아래 production은 정규식 리터럴의 구문을 설명하며, 입력 요소 스캐너가 정규식 리터럴의 끝을 찾는 데 사용된다.
구현은
정규식 리터럴은 비어 있을 수 없다; 빈 정규식 리터럴을 나타내는 대신, 코드 단위 시퀀스 //는 단일 행 주석을 시작한다. 빈 정규식을 명시하려면 /(?:)/를 사용하라.
The syntax-directed operation BodyText takes no arguments and returns source text. It is defined piecewise over the following productions:
The syntax-directed operation FlagText takes no arguments and returns source text. It is defined piecewise over the following productions:
The syntax-directed operation TV takes no arguments and returns a String or
The syntax-directed operation TRV takes no arguments and returns a String. 템플릿 리터럴 구성 요소는 TRV에 의해
대부분의 ECMAScript 문장과 선언은 세미콜론으로 끝나야 한다. 그러한 세미콜론은 언제나 소스 텍스트에 명시적으로 나타날 수 있다. 그러나 편의를 위해, 어떤 상황에서는 그러한 세미콜론을 소스 텍스트에서 생략할 수 있다. 이러한 상황은 그런 경우 소스 코드 토큰 스트림에 세미콜론이 자동으로 삽입된다고 설명된다.
다음 규칙에서 “token”은
세미콜론 삽입에는 세 가지 기본 규칙이 있다:
소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 문법의 어떤 production에도 허용되지 않는 토큰(이를 문제가 되는 토큰이라고 부른다)을 만나면, 다음 조건 중 하나 이상이 참일 경우 문제가 되는 토큰 앞에 세미콜론이 자동으로 삽입된다:
}이다.
)이고, 삽입된 세미콜론이 do-while 문(그러나 앞선 규칙들에 대한 추가적인 우선 조건이 있다: 그 세미콜론이 빈 문장으로 파싱되거나, 또는 그 세미콜론이 for 문의 헤더 안의 두 세미콜론 중 하나가 된다면(참조:
문법에서 제한된 production은 다음뿐이다:
이러한 제한된 production의 실질적 효과는 다음과 같다:
++ 또는 -- 토큰을 후위 연산자로 처리하려는 위치에서 그것을 만났고, 이전 토큰과 ++ 또는 -- 토큰 사이에 적어도 하나의 ++ 또는 -- 토큰 앞에 세미콜론이 자동으로 삽입된다.
continue, break, return, throw, 또는 yield 토큰을 만났고 다음 토큰 전에 continue, break, return, throw, 또는 yield 토큰 뒤에 세미콜론이 자동으로 삽입된다.
=> 토큰 전에 async 토큰 뒤에 function 또는 ( 토큰 전에 async 토큰은 뒤따르는 토큰들과 같은 표현식 또는 클래스 요소의 일부로 취급되지 않는다.
async 토큰 뒤에 * 토큰 전에 이에 따른 ECMAScript 프로그래머에 대한 실질적 조언은 다음과 같다:
++ 또는 -- 연산자는 그 피연산자와 같은 줄에 있어야 한다.
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 문이 반환할 값으로 취급되지 않는데, 그것이 return 토큰과
소스
a = b
++c
는 자동 세미콜론 삽입에 의해 다음과 같이 변환된다:
a = b;
++c;
토큰 ++는 변수 b에 적용되는 후위 연산자로 취급되지 않는데, b와 ++ 사이에
소스
if (a > b)
else c = d
는 유효한 ECMAScript 문장이 아니며, 그 지점에서 문법의 어떤 production도 적용되지 않더라도, 자동으로 삽입된 세미콜론이 빈 문장으로 파싱되기 때문에 else 토큰 앞에서 자동 세미콜론 삽입에 의해 변경되지 않는다.
소스
a = b + c
(d + e).print()
는 자동 세미콜론 삽입에 의해 변환되지 않는다. 왜냐하면 두 번째 줄을 시작하는 괄호로 둘러싸인 표현식은 함수 호출의 인수 목록으로 해석될 수 있기 때문이다:
a = b + c(d + e).print()
대입문이 반드시 왼쪽 괄호로 시작해야 하는 상황에서는, 프로그래머가 자동 세미콜론 삽입에 의존하기보다 앞선 문장의 끝에 명시적인 세미콜론을 제공하는 것이 좋다.
ECMAScript 프로그램은 자동 세미콜론 삽입에 의존하여 매우 적은 수의 세미콜론만 사용하는 스타일로 작성될 수 있다. 위에서 설명했듯이, 세미콜론은 모든 개행마다 삽입되는 것이 아니며, 자동 세미콜론 삽입은 줄 종결자를 가로지르는 여러 토큰에 의존할 수 있다.
새로운 구문 기능이 ECMAScript에 추가되면, 그 앞에서 자동 세미콜론 삽입에 의존하던 줄이 파싱될 때 다른 문법 production으로 바뀌게 만드는 추가 문법 production이 추가될 수 있다.
이 절의 목적상, 자동 세미콜론 삽입의 경우는 그것 앞에 오는 소스 텍스트에 따라 세미콜론이 삽입될 수도 있고 안 될 수도 있는 위치라면 흥미로운 것으로 간주된다. 이 절의 나머지는 이 버전의 ECMAScript에서 나타나는 자동 세미콜론 삽입의 여러 흥미로운 경우를 설명한다.
(). 세미콜론이 없으면 두 줄은 함께 [). 세미콜론이 없으면 두 줄은 `). 세미콜론이 없으면 두 줄은 이전 표현식을 + 또는 -. 세미콜론이 없으면 두 줄은 대응하는 이항 연산자의 사용으로 함께 해석된다./ ECMAScript는 “[no
이 절의 나머지는 이 버전의 ECMAScript에서 “[no