어휘 구조
문서
M 문서는 유니코드 문자의 순서가 지정된 시퀀스입니다. M은 M 문서의 여러 부분에서 유니코드 문자의 다양한 클래스를 허용합니다. 유니코드 문자 클래스에 대한 자세한 내용은 유니코드 표준, 버전 3.0, 섹션 4.5를 참조하세요.
문서는 정확히 하나의 식으로 구성되거나 섹션으로 구성된 정의 그룹으로 구성됩니다. 섹션은 10장에서 자세히 설명합니다. 개념적으로 다음 단계는 문서에서 식을 읽는 데 사용됩니다.
문서는 문자 인코딩 체계에 따라 유니코드 문자 시퀀스로 디코딩됩니다.
어휘 분석을 수행하여 유니코드 문자 스트림을 토큰 스트림으로 변환합니다. 이 섹션의 나머지 하위 섹션에서는 어휘 분석을 다룹니다.
구문 분석을 수행하여 토큰 스트림을 평가할 수 있는 양식으로 변환합니다. 이 프로세스는 후속 섹션에서 다룹니다.
문법 규칙
어휘 및 구문 문법은 문법 제작을 사용하여 제공됩니다. 각 문법 프로덕션은 비단말 기호와 해당 비터미널 기호의 가능한 확장을 터미널이 아닌 기호 또는 터미널 기호의 시퀀스로 정의합니다. 문법 제작 에서 터미널+ 기호가 아닌 기호는 기울임꼴 형식으로 표시되고 터미널 기호는 고정 너비 글꼴로 표시됩니다.
문법 프로덕션의 첫 번째 줄에는 정의되는 비터미널 기호의 이름과 콜론이 차례로 표시됩니다. 각 연속 들여쓰기 선에는 비단말 또는 터미널 기호 시퀀스로 지정된 비터미널의 가능한 확장이 포함됩니다. 예를 들어 다음 프로덕션은
if-expression:
if
if-condition then
true-expressionelse
false 식
토큰 if
, if-condition, 토큰 then
, true-expression, 토큰 else
, false-expression을 차례로 사용하여 구성되는 if-expression을 정의합니다.
비터미널 기호의 가능한 확장이 두 개 이상 있는 경우 대체 항목은 별도 줄에 나열됩니다. 예를 들어 다음 프로덕션은
variable-list:
변수
variable-list ,
변수
는 변수 목록으로 구성되거나 변수 목록과 변수로 구성된 변수 목록을 정의합니다. 즉, 정의는 재귀적이며 변수 목록이 쉼표로 구분된 하나 이상의 변수로 구성되도록 지정합니다.
아래 첨자 접미사 "opt"는 선택적 기호를 나타내는 데 사용됩니다. 프로덕션:
필드 사양:
optional
opt field-name =
field-type
다음의 줄임 표기입니다.
field-specification:
field-name =
field-type
optional
field-name =
field-type
필요에 따라 터미널 기호와 필드 이름, 터미널 =
기호 optional
및 필드 형식으로 시작하는 필드 사양을 정의합니다.
대안은 일반적으로 별도의 줄에 나열되지만, 대안이 많은 경우 "중 하나"라는 문구가 한 줄에 지정된 확장 목록 앞에 나타날 수 있습니다. 이는 별도의 줄에 각 대안을 나열하기 위한 약식입니다. 예를 들어 다음 프로덕션은
decimal-digit: 다음 중 하나로,
0 1 2 3 4 5 6 7 8 9
다음의 줄임 표기입니다.
decimal-digit:
0
1
2
3
4
5
6
7
8
9
어휘 분석
어휘 단위 프로덕션은 M 문서의 어휘 문법을 정의합니다. 모든 유효한 M 문서는 이 문법을 준수합니다.
lexical-unit:
lexical-elementsopt
lexical-elements:
lexical-element
lexical-element
lexical-elements
lexical-element:
whitespace
token comment
어휘 수준에서 M 문서는 공백, 주석 및 토큰 요소의 스트림으로 구성됩니다. 다음 섹션에서 각 프로덕션을 설명합니다. 토큰 요소만 구문 문법에서 중요합니다.
공백
공백은 M 문서 내에서 주석과 토큰을 구분하는 데 사용됩니다. 공백에는 공백 문자(유니코드 클래스 Zs의 일부)와 가로 및 세로 탭, 양식 피드 및 줄 바꿈 문자 시퀀스가 포함됩니다. 줄 바꿈 문자 시퀀스에는 캐리지 리턴, 줄 바꿈, 캐리지 리턴, 줄 바꿈, 다음 줄 및 단락 구분 문자가 포함됩니다.
공백:
유니코드 클래스 Zs를 사용하는 모든 문자
가로 탭 문자(U+0009
)
세로 탭 문자(U+000B
)
양식 피드 문자(U+000C
)
캐리지 리턴 문자(U+000D
) 뒤에 줄 바꿈 문자(U+000A
)
줄 바꿈 문자
new-line-character:
캐리지 리턴 문자(U+000D
)
줄 바꿈 문자(U+000A
)
다음 줄 문자(U+0085
)
줄 구분 문자(U+2028
)
단락 구분 문자(U+2029
)
파일 끝 표식을 추가하는 소스 코드 편집 도구와의 호환성을 위해 문서를 올바르게 종료된 줄의 시퀀스로 볼 수 있도록 하려면 M 문서에 다음 변환이 순서대로 적용됩니다.
문서의 마지막 문자가 Control-Z 문자(
U+001A
)인 경우 이 문자는 삭제됩니다.해당 문서가 비어 있지 않고 문서의 마지막 문자가 캐리지 리턴(
U+000D
), 줄 바꿈(), 줄 구분 기호() 또는 단락 구분 기호U+2029
(U+000D
)가 아닌 경우 문서 끝에 캐리지 리턴 문자(U+000A
U+2028
)가 추가됩니다.
설명
단일 줄 주석 주석과 구분된 주석의 두 가지 형태가 지원됩니다. 단일 줄 주석 문자 //
로 시작하고 소스 줄의 끝까지 확장됩니다. 구분된 주석은 문자로 시작하고 문자 /*
*/
로 끝납니다.
구분된 주석은 여러 줄에 걸쳐 있을 수 있습니다.
comment:
single-line-comment
delimited-comment
single-line-comment:
//
한 줄-주석 문자opt
single-line-comment-characters:
single-line-comment-character single-line-comment-charactersopt
single-line-comment-character:
new-line-character를 제외한 임의 유니코드 문자
delimited-comment:
/*
delimited-comment-textopt 별표 /
delimited-comment-text:
delimited-comment-section delimited-comment-textopt
delimited-comment-section:
/
asterisksopt not-slash-or-asterisk
asterisks:
*
별표옵트
not-slash-or-asterisk:
다음을 제외한 *
모든 유니코드 문자 /
주석은 중첩되지 않습니다. /*
및 */
문자 시퀀스는 한 줄 주석 내에서 특별한 의미가 없으며, //
및 /*
문자 시퀀스는 끝을 지정하는 주석 내에서 특별한 의미가 없습니다.
주석은 텍스트 리터럴 내에서 처리되지 않습니다. 예제
/* Hello, world
*/
"Hello, world"
에는 구분된 주석이 포함되어 있습니다.
예제
// Hello, world
//
"Hello, world" // This is an example of a text literal
는 여러 단일 줄 주석 표시합니다.
토큰
토큰은 식별자, 키워드, 리터럴, 연산자 또는 문장 부호입니다. 공백 및 주석은 토큰을 구분하는 데 사용되지만 토큰으로 간주되지 않습니다.
token:
식별자
keyword
literal
operator-or-punctuator
문자 이스케이프 시퀀스
M 텍스트 값은 임의의 유니코드 문자를 포함할 수 있습니다. 그러나 텍스트 리터럴은 그래픽 문자로 제한되며 그래픽이 아닌 문자에 이스케이프 시퀀스를 사용해야 합니다. 예를 들어 텍스트 리터럴 #(cr)
에 캐리지 리턴, 줄 바꿈 또는 탭 문자를 포함하려면 각각 , #(lf)
및 #(tab)
이스케이프 시퀀스를 사용할 수 있습니다. 이스케이프 시퀀스 시작 문자를 #(
텍스트 리터럴에 포함하려면 그 자체를 이 #
스케이프해야 합니다.
#(#)(
이스케이프 시퀀스에는 짧은(16진수 4자리) 또는 long(86진수) 유니코드 코드 포인트 값이 포함될 수도 있습니다. 따라서 다음 세 개의 이스케이프 시퀀스는 동일합니다.
#(000D) // short Unicode hexadecimal value
#(0000000D) // long Unicode hexadecimal value
#(cr) // compact escape shorthand for carriage return
여러 이스케이프 코드를 쉼표로 구분하여 단일 이스케이프 시퀀스에 포함할 수 있습니다. 따라서 다음 두 시퀀스는 동일합니다.
#(cr,lf)
#(cr)#(lf)
다음은 M 문서에서 문자 이스케이프의 표준 메커니즘에 대해 설명합니다.
character-escape-sequence:
#(
escape-sequence-list )
escape-sequence-list:
single-escape-sequence
single-escape-sequence ,
escape-sequence-list
single-escape-sequence:
long-unicode-escape-sequence
short-unicode-escape-sequence
control-character-escape-sequence
escape-escape
long-unicode-escape-sequence:
hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit
short-unicode-escape-sequence:
hex-digit hex-digit hex-digit hex-digit
control-character-escape-sequence:
control-character
control-character:
cr
lf
tab
이스케이프 이스케이프:
#
리터럴
리터럴은 값의 원본 코드 표현입니다.
literal:
logical-literal
number-literal
text-literal
null-literal
축자 리터럴
Null 리터럴
null 리터럴은 값을 작성하는 null
데 사용됩니다. 값이 null
없는 값을 나타냅니다.
null 리터럴:
null
논리적 리터럴
논리 리터럴은 값을 true
작성하는 데 사용되며 false
논리 값을 생성합니다.
논리 리터럴:
true
false
숫자 리터럴
숫자 리터럴은 숫자 값을 작성하는 데 사용되며 숫자 값을 생성합니다.
number-literal:
decimal-number-literal
hexadecimal-number-literal
decimal-number-literal:
decimal-digits .
decimal-digits exponent-partopt
.
decimal-digits exponent-partopt
decimal-digits exponent-partopt
decimal-digits:
decimal-digit decimal-digitsopt
decimal-digit: 다음 중 하나
0 1 2 3 4 5 6 7 8 9
exponent-part:
e
signopt decimal-digits
E
signopt decimal-digits
sign: 다음 중 하나
+ -
16진수-number-literal:
0x
16자리 숫자
0X
16자리 숫자
hex-digits:
hex-digit hex-digitsopt
hex-digit: 다음 중 하나
0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
16진수 앞에 문자0x
가 있는 숫자를 16진수 형식으로 지정할 수 있습니다. 예시:
0xff // 255
소수점이 숫자 리터럴에 포함된 경우 소수점 다음에 적어도 한 자리가 있어야 합니다. 예를 들어 1.3
숫자 리터럴이지만 1.
1.e3
그렇지 않습니다.
텍스트 리터럴
텍스트 리터럴은 유니코드 문자 시퀀스를 작성하는 데 사용되며 텍스트 값을 생성합니다.
text-literal:
"
text-literal-charactersopt "
text-literal-characters:
text-literal-character text-literal-charactersopt
text-literal-character:
single-text-character
character-escape-sequence
double-quote-escape-sequence
single-text-character:
() 또는 #
(U+0022
U+0023
) 뒤에 ()를U+0028
(
제외한 "
모든 문자
큰따옴표 이스케이프 시퀀스:
""
(U+0022
, U+0022
)
텍스트 값에 따옴표를 포함하려면 다음과 같이 따옴표가 반복됩니다.
"The ""quoted"" text" // The "quoted" text
문자 이스케이프 시퀀스 프로덕션을 사용하여 문서에서 유니코드 문자로 직접 인코딩하지 않고도 텍스트 값에 문자를 쓸 수 있습니다. 예를 들어 캐리지 리턴 및 줄 바꿈은 다음과 같이 텍스트 값으로 작성할 수 있습니다.
"Hello world#(cr,lf)"
축자 리터럴
축자 리터럴은 사용자가 코드로 입력했지만 코드로 올바르게 구문 분석할 수 없는 유니코드 문자 시퀀스를 저장하는 데 사용됩니다. 런타임 시 오류 값이 생성됩니다.
축자 리터럴:
#!"
text-literal-charactersopt "
Identifiers
식별자는 값을 참조하는 데 사용되는 이름입니다. 식별자는 일반 식별자 또는 따옴표 붙은 식별자일 수 있습니다.
identifier:
regular-identifier
quoted-identifier
regular-identifier:
available-identifier
available-identifier dot-character regular-identifier
available-identifier:
keyword가 아닌 keyword-or-identifier
keyword-or-identifier:
identifier-start-character identifier-part-charactersopt
identifier-start-character:
letter-character
underscore-character
identifier-part-characters:
identifier-part-character identifier-part-charactersopt
identifier-part-character:
letter-character
decimal-digit-character
underscore-character
connecting-character
combining-character
formatting-character
dot-character:
.
(U+002E
)
밑줄 문자:
_
(U+005F
)
문자 문자:
Lu, Ll, Lt, Lm, Lo 또는 Nl 클래스의 유니코드 문자
combining-character:
Mn 또는 Mc 클래스의 유니코드 문자
decimal-digit-character:
Nd 클래스의 유니코드 문자
connecting-character:
클래스 PC의 유니코드 문자
formatting-character:
Cf 클래스의 유니코드 문자
따옴표 붙은 식별자를 사용하여 키워드, 공백, 주석, 연산자 및 문장 부호를 포함하여 0개 이상의 유니코드 문자 시퀀스를 식별자로 사용할 수 있습니다.
quoted-identifier:
#"
text-literal-charactersopt "
따옴표를 이스케이프하기 위한 이스케이프 시퀀스 및 큰따옴표는 텍스트 리터럴과 마찬가지로 따옴표 붙은 식별자에서 사용할 수 있습니다.
다음 예제에서는 공백 문자를 포함하는 이름에 식별자 따옴표를 사용합니다.
[
#"1998 Sales" = 1000,
#"1999 Sales" = 1100,
#"Total Sales" = #"1998 Sales" + #"1999 Sales"
]
다음 예제에서는 식별자 따옴표를 사용하여 식별자에 연산자를 포함합니다 +
.
[
#"A + B" = A + B,
A = 1,
B = 2
]
일반화된 식별자
M에는 공백을 포함하거나 키워드 또는 숫자 리터럴인 식별자가 모호성을 도입하지 않는 두 위치가 있습니다. 이러한 위치는 레코드 리터럴의 레코드 필드 이름이며 필드 액세스 연산자([ ]
)에서 M은 따옴표 붙은 식별자를 사용하지 않고도 이러한 식별자를 허용합니다.
[
Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]
]
필드 이름을 지정하고 액세스하는 데 사용되는 식별자를 일반화된 식별자라고 하며 다음과 같이 정의됩니다.
generalized-identifier:
generalized-identifier-part
공백으로만 구분된 generalized-identifier(U+0020
)
generalized-identifier-part
generalized-identifier-part:
generalized-identifier-segment
decimal-digit-character generalized-identifier-segment
generalized-identifier-segment:
keyword-or-identifier
keyword-or-identifier dot-character keyword-or-identifier
키워드
키워드는 예약된 식별자와 유사한 문자 시퀀스이며 식별자 따옴표 메커니즘을 사용하는 경우 또는 일반화된 식별자가 허용되는 경우를 제외하고는 식별자로 사용할 수 없습니다.
키워드: 다음 중 하나
and as each else error false if in is let meta not null or otherwise
section shared then true try type #binary #date #datetime
#datetimezone #duration #infinity #nan #sections #shared #table #time
연산자 및 문장 부호
연산자와 문장 부호에는 여러 종류가 있습니다. 연산자는 식에서 하나 이상의 피연산자를 포함하는 작업을 설명하는 데 사용됩니다. 예를 들어 식 a + b
는 +
연산자를 사용하여 두 개의 피연산자 a
및 b
를 추가합니다. 문장 부호는 그룹화 및 구분을 위한 것입니다.
operator-or-punctuator: 다음 중 하나
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...