?
u
m
/
p
1-9
0
`
ECMAScript
입력 요소를 소비하는 구문 문법(syntactic grammar) 문맥에 따라 어휘 입력 요소 식별이 민감하게 달라지는 여러 상황이 있다. 이는 어휘 문법에 여러 목표 심볼(lexical goal symbol)이 필요한 이유이다.
여러 어휘 목표를 사용하는 것은 자동 세미콜론 삽입에 영향을 주는 어휘적 모호성이 없도록 보장한다. 예를 들어 선행 division 또는 division-assignment 와 선행
a = b
/hi/g.exec(c).map(d);
a = b / hi / g.exec(c).map(d);
유니코드 서식 제어 문자(즉, 유니코드 문자 데이터베이스 범주 “Cf” 에 속하는 LEFT-TO-RIGHT MARK, RIGHT-TO-LEFT MARK 등)는 상위 수준 프로토콜(예: 마크업 언어)이 없는 상황에서 텍스트 범위 서식을 제어하는 데 사용하는 제어 코드이다.
소스 텍스트에서 편집 및 표시를 용이하게 하기 위해 서식 제어 문자를 허용하는 것이 유용하다. 모든 서식 제어 문자는 주석 내부, 그리고 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 내부에 사용할 수 있다.
U+FEFF (ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트 시작 부분에서 해당 텍스트가 유니코드임을 표시하고 인코딩과 바이트 순서를 감지할 수 있도록 하는 서식 제어 문자이다. 이 목적을 위한 <ZWNBSP> 문자가 파일을 연결(concatenate)한 결과 등으로 텍스트 시작 이후에 나타나는 경우도 있다. ECMAScript 소스 텍스트에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 밖에서는 공백 문자(
공백 코드 포인트는 소스 텍스트 가독성을 높이고 토큰(분할 불가능한 어휘 단위)들을 분리하기 위해 사용되며, 그 외에는 의미가 없다. 공백 코드 포인트는 임의의 두 토큰 사이 및 입력 시작과 끝에 나타날 수 있다. 공백 코드 포인트는
ECMAScript 공백 코드 포인트는
Code Points | Name | Abbreviation |
---|---|---|
U+0009
|
CHARACTER TABULATION | <TAB> |
U+000B
|
LINE TABULATION | <VT> |
U+000C
|
FORM FEED (FF) | <FF> |
U+FEFF
|
ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
any code point in general category “Space_Separator” | <USP> |
U+0020 (SPACE) 과 U+00A0 (NO-BREAK SPACE) 코드 포인트는 <USP> 에 속한다.
공백 코드 포인트와 마찬가지로 줄 종결자 코드 포인트는 소스 텍스트 가독성을 높이고 토큰을 서로 분리한다. 그러나 공백 코드 포인트와 달리 줄 종결자는 구문 문법 동작에 일부 영향을 준다. 일반적으로 줄 종결자는 임의의 두 토큰 사이에 나타날 수 있지만, 구문 문법이 금지하는 몇몇 위치에는 나타날 수 없다. 줄 종결자는 자동 세미콜론 삽입 과정(
줄 종결자는
줄 종결자는 정규 표현식에서 \s
클래스가 매칭하는 공백 코드 포인트 집합에 포함된다.
ECMAScript 줄 종결자 코드 포인트는
Code Point | Unicode Name | Abbreviation |
---|---|---|
U+000A
|
LINE FEED (LF) | <LF> |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
U+2028
|
LINE SEPARATOR | <LS> |
U+2029
|
PARAGRAPH SEPARATOR | <PS> |
주석은 단일 행 또는 다중 행일 수 있다. 다중 행 주석은 중첩될 수 없다.
단일 행 주석은 //
마커로부터 그 줄 끝까지의 모든 코드 포인트로 구성된다. 단, 줄 끝의
주석은 공백처럼 동작하며 폐기되지만,
이 절의 다수 생성물은
Hashbang 주석은 위치에 민감하며 다른 종류의 주석처럼 구문 문법 입력 요소 스트림에서 제거(discard)된다.
본 표준은 특정 코드 포인트 추가를 지정한다: U+0024 (DOLLAR SIGN) 과 U+005F (LOW LINE)는
비단말
비단말 _
를 도출한다.
유니코드 속성 “ID_Start” 와 “ID_Continue” 를 가진 코드 포인트 집합은 각각 “Other_ID_Start” 및 “Other_ID_Continue” 속성의 코드 포인트를 포함한다.
유니코드 이스케이프 시퀀스는 \
는 어떠한 코드 포인트도 기여하지 않는다. \
유니코드 표준에 따라 정규적으로 등가(canonically equivalent)인 두
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
키워드(keyword) 는 fixed width
) 글꼴로 문자 그대로 등장하는 토큰이다. ECMAScript 키워드에는 if
, while
, async
, await
등 다수가 포함된다.
예약어(reserved word) 는 식별자로 사용할 수 없는 if
, while
은 항상 예약어이다. await
는 async 함수 및 모듈 내부에서만 예약된다. async
는 예약되지 않으며 제한 없이 변수 이름이나 레이블로 사용할 수 있다.
이 명세는 문법 생성물과 조기 오류 규칙을 조합하여 어떤 이름이 유효한 식별자이고 어떤 것이 예약어인지 지정한다. 아래 await
, yield
제외)은 무조건 예약된다. await
, yield
예외는 매개변수화된 구문 생성물을 사용하는
Math
, window
, toString
, _
처럼 항상 식별자로 허용되고 키워드가 아닌 것;
await
, yield
를 제외한 아래
await
, yield
처럼 문맥적으로 식별자로 허용되는 것;
strict 모드 코드에서 문맥적으로 식별자로 허용되지 않는 것: let
, static
, implements
, interface
, package
, private
, protected
, public
;
as
, async
, from
, get
, meta
, of
, set
, target
처럼 항상 식별자로 허용되지만 특정 구문 생성물 안에서
조건부 키워드 또는 문맥적 키워드(contextual keyword) 라는 용어는 마지막 세 범주에 속해 어떤 문맥에서는 식별자, 다른 문맥에서는 키워드로 쓰일 수 있는 키워드를 가리킬 때 사용되기도 한다.
\
\
els\u{65}
처럼 작성하여 이름이 "else" 인 변수를 선언할 수는 없다.
enum
은 현재 본 명세에서 키워드로 사용되지 않는다. 이는 향후 언어 확장을 위해 예약된 미래 예약어 (future reserved word)이다.
마찬가지로 implements
, interface
, package
, private
, protected
, public
는 strict 모드 코드에서 미래 예약어이다.
예: 3in
은 오류이며 3
과 in
두 입력 요소가 아니다.
숫자 리터럴은
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 0개 이상의 유니코드 코드 포인트이다. 유니코드 코드 포인트는 이스케이프 시퀀스로도 표현할 수 있다. 닫는 따옴표 코드 포인트, U+005C (REVERSE SOLIDUS), U+000D (CR), U+000A (LF)를 제외한 모든 코드 포인트는 문자열 리터럴 안에 그대로 나타날 수 있다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다. 문자열 리터럴은 ECMAScript String 값을 평가 결과로 가진다. 이러한 String 값을 생성할 때 유니코드 코드 포인트는
비단말
<LF>, <CR> 은 \n
또는 \u000A
같은 이스케이프를 사용해야 한다.
문자열 리터럴이 뒤따르는
function invalid() { "\7"; "use strict"; }
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
문자열 리터럴은
Escape Sequence | Code Unit Value | Unicode Character Name | Symbol |
---|---|---|---|
\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 |
\
|
아래 생성물은 정규 표현식 리터럴의 구문을 기술하며 입력 요소 스캐너가 리터럴 끝을 찾는 데 사용된다.
구현은
정규 표현식 리터럴은 비어 있을 수 없다. //
는 빈 정규식이 아니라 단일 행 주석 시작이다. 빈 정규식을 지정하려면 /(?:)/
사용.
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 템플릿 리터럴 구성 요소는 TV 에 의해
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 템플릿 리터럴 구성 요소는 TRV 에 의해 String 값으로 해석(템플릿 raw 값 구성). TRV 는 TV 와 유사하지만 이스케이프 시퀀스를 그대로(문자열 상 표기 그대로) 반영한다.
TV 는
대부분의 ECMAScript 문과 선언은 세미콜론으로 종료되어야 하며, 그 세미콜론은 항상 소스에 명시적으로 쓸 수 있다. 편의를 위해 특정 상황에서는 세미콜론을 생략할 수 있으며, 이 상황에서는 세미콜론이 소스 코드 토큰 스트림에 자동 삽입된다고 기술한다.
다음 규칙에서 “토큰(token)” 은
세 가지 기본 규칙은 다음과 같다:
왼쪽에서 오른쪽으로 파싱 중 문법의 어떤 생성물에도 허용되지 않는 토큰(“오류 토큰(offending token)”)을 만났을 때, 아래 조건 중 하나 이상이 참이면 그 토큰 앞에 세미콜론을 자동 삽입한다:
}
임.)
이고 삽입된 세미콜론이 do-while 문(그러나 추가 최우선 조건이 있다: 세미콜론이 빈 문(empty statement)으로 파싱되거나 for
문의 두 세미콜론 중 하나가 되게 하는 경우에는 자동 삽입되지 않는다 (
문법 내 유일한 제한 생성물은 다음과 같다:
실질적 효과:
++
/ --
가 후위(postfix)로 해석될 위치에서 그 앞에 continue
, break
, return
, throw
, yield
뒤에 =>
사이에 async
뒤 function
/ 식별자 / (
전에 async
뒤 *
전에 프로그래머를 위한 요약:
++
/ --
는 피연산자와 같은 줄에 둔다.return
, throw
, yield
뒤 표현식은 같은 줄에서 시작.break
, continue
뒤 =>
는 같은 줄.async
는 바로 뒤 토큰과 같은 줄.다음 소스
{ 1 2 } 3
는 자동 삽입 규칙이 있어도 유효한 ECMAScript 문장이 아니다. 반면:
{ 1
2 } 3
역시 유효하지 않지만 자동 삽입으로 다음으로 변환된다:
{ 1
;2 ;} 3;
이는 유효한 문장이다.
다음 소스
for (a; b
)
는 유효하지 않으며 for
문 헤더 세미콜론은 자동 삽입되지 않으므로 변경되지 않는다.
다음 소스
return
a + b
는 다음으로 변환된다:
return;
a + b;
a + b
는 return
반환 값이 아니다.
다음 소스
a = b
++c
는 다음으로 변환된다:
a = b;
++c;
++
는 b
의 후위 연산자가 아니다 (줄 종결자 존재).
다음 소스
if (a > b)
else c = d
는 유효하지 않으며 else
앞에 자동 삽입되지 않는다 (그 위치 삽입 시 빈 문 생성).
다음 소스
a = b + c
(d + e).print()
는 변환되지 않는다. 괄호로 시작하는 두 번째 줄은 함수 호출 인수 목록으로 해석될 수 있기 때문이다:
a = b + c(d + e).print()
할당문이 왼쪽 괄호로 시작해야 한다면 이전 문 끝에 명시적으로 세미콜론을 쓰는 것이 좋다.
프로그래머는 자동 세미콜론 삽입에 의존하여 매우 적은 세미콜론으로 프로그램을 작성할 수 있다. 위에서 설명했듯 세미콜론은 모든 줄바꿈마다 삽입되지 않으며 줄 종결자를 넘어 여러 토큰에 의존할 수 있다.
새 구문 기능이 추가되면서 기존 자동 삽입에 의존하던 줄이 다른 방식으로 파싱될 수 있는 추가 생성물이 도입될 수 있다.
이 절에서는 앞선 소스 텍스트에 따라 세미콜론이 삽입될 수도/안 될 수도 있는 위치를 ‘흥미로운’ 사례로 본다. 이하에서는 이 ECMAScript 버전의 그러한 사례들을 기술한다.
(
): 없으면 두 줄이 [
): 없으면 속성 접근으로 간주 (`
): 없으면 태그드 템플릿으로 해석(앞 표현식이 +
또는 -
: 없으면 이항 연산 조합으로 해석될 수 있음./
가 ECMAScript 는 “[no
이 절의 나머지 부분은 본 ECMAScript 버전의 이러한 생성물 사례들을 나열한다.