Struktur Leksikal
Dokumen
Dokumen M adalah urutan karakter Unicode yang diurutkan. M memungkinkan kelas karakter Unicode yang berbeda di berbagai bagian dokumen M. Untuk informasi tentang kelas karakter Unicode, lihat Unicode Standard, Versi 3.0, bagian 4.5.
Dokumen terdiri dari tepat satu ekspresi atau grup definisi yang diatur ke dalam bagian. Bagian dijelaskan secara rinci dalam Bab 10. Secara konseptual, langkah-langkah berikut digunakan untuk membaca ekspresi dari dokumen:
Dokumen didekodekan sesuai dengan skema pengodean karakternya ke dalam urutan karakter Unicode.
Analisis leksikal dilakukan, sehingga menerjemahkan aliran karakter Unicode ke dalam aliran token. Subbagian yang tersisa dari bagian ini mencakup analisis leksikal.
Analisis syntactic dilakukan, sehingga menerjemahkan aliran token ke dalam bentuk yang dapat dievaluasi. Proses ini tercakup dalam bagian berikutnya.
Konvensi tata bahasa
Tata bahasa leksikal dan sinactik disajikan menggunakan produksi tata bahasa. Setiap produksi tata bahasa mendefinisikan simbol non-terminal dan kemungkinan ekspansi simbol nonterminal tersebut ke dalam urutan simbol non-terminal atau terminal. Dalam produksi tata bahasa, simbol non-terminal+ ditampilkan dalam jenis miring, dan simbol terminal ditampilkan dalam font lebar tetap.
Baris pertama produksi tata bahasa adalah nama simbol non-terminal yang didefinisikan, diikuti oleh titik dua. Setiap baris inden berturut-turut berisi kemungkinan perluasan nonterminal yang diberikan sebagai urutan simbol non-terminal atau terminal. Misalnya, produksi:
if-expression:
if
if-condition then
true-expressionelse
false-expression
mendefinisikan ekspresi if untuk terdiri dari token if
, diikuti dengan if-condition, diikuti dengan token then
, diikuti dengan true-expression, diikuti oleh token else
, diikuti dengan false-expression.
Ketika ada lebih dari satu kemungkinan perluasan simbol non-terminal, alternatif dicantumkan pada baris terpisah. Misalnya, produksi:
daftar variabel:
variabel
variabel daftar ,
variabel
menentukan daftar variabel untuk terdiri dari variabel atau terdiri dari daftar variabel diikuti oleh variabel. Dengan kata lain, definisinya rekursif dan menentukan bahwa daftar variabel terdiri dari satu atau beberapa variabel, dipisahkan oleh koma.
Akhiran subskrip "opt" digunakan untuk menunjukkan simbol opsional. Produksi:
spesifikasi bidang:
optional
opt field-name =
field-type
singkatan untuk:
spesifikasi bidang:
jenis bidang nama =
bidang
optional
nama =
bidang jenis bidang
dan mendefinisikan spesifikasi bidang untuk secara opsional dimulai dengan simbol optional
terminal diikuti dengan nama bidang, simbol =
terminal , dan jenis bidang.
Alternatif biasanya tercantum pada baris terpisah, meskipun dalam kasus di mana ada banyak alternatif, frasa "salah satu" dapat mendahului daftar ekspansi yang diberikan pada satu baris. Ini hanya singkatan untuk mencantumkan masing-masing alternatif pada baris terpisah. Misalnya, produksi:
digit desimal: salah satu dari
0 1 2 3 4 5 6 7 8 9
singkatan untuk:
digit desimal:
0
1
2
3
4
5
6
7
8
9
Analisis Leksikal
Produksi unit leksikal mendefinisikan tata bahasa leksikal untuk dokumen M. Setiap dokumen M yang valid sesuai dengan tata bahasa ini.
unit leksikal:
elemen leksikalmemilih
elemen leksikal:
elemen leksikal
elemen leksikal
elemen leksikal
elemen leksikal:
spasi kosong
komentar token
Pada tingkat leksikal, dokumen M terdiri dari aliran elemen spasi kosong, komentar, dan token . Masing-masing produksi ini tercakup dalam bagian berikut. Hanya elemen token yang signifikan dalam tata bahasa sintik.
Whitespace
Spasi kosong digunakan untuk memisahkan komentar dan token dalam dokumen M. Spasi kosong mencakup karakter spasi (yang merupakan bagian dari kelas Unicode Zs), serta tab horizontal dan vertikal, umpan formulir, dan urutan karakter baris baru. Urutan karakter baris baru mencakup karakter pengembalian gerbong, umpan baris, pengembalian pengangkutan diikuti oleh umpan baris, baris berikutnya, dan karakter pemisah paragraf.
spasi kosong:
Karakter apa pun dengan kelas Unicode Zs
Karakter tab horizontal (U+0009
)
Karakter tab vertikal (U+000B
)
Karakter umpan formulir (U+000C
)
Karakter pengembalian pengangkutan (U+000D
) diikuti oleh karakter umpan baris (U+000A
)
karakter baris baru
karakter baris baru:
Karakter pengembalian pengangkutan (U+000D
)
Karakter umpan baris (U+000A
)
Karakter baris berikutnya (U+0085
)
Karakter pemisah garis (U+2028
)
Karakter pemisah paragraf (U+2029
)
Untuk kompatibilitas dengan alat pengeditan kode sumber yang menambahkan penanda akhir file, dan untuk memungkinkan dokumen dilihat sebagai urutan baris yang dihentikan dengan benar, transformasi berikut diterapkan, secara berurutan, ke dokumen M:
Jika karakter terakhir dokumen adalah karakter Control-Z (
U+001A
), karakter ini akan dihapus.Karakter carriage-return (
U+000D
) ditambahkan ke akhir dokumen jika dokumen tersebut tidak kosong dan jika karakter terakhir dokumen bukan pengembalian pengangkutan (U+000D
), umpan baris (U+000A
), pemisah baris (U+2028
), atau pemisah paragraf (U+2029
).
Komentar
Dua bentuk komentar didukung: komentar baris tunggal dan komentar yang dibatasi. Komentar baris tunggal dimulai dengan karakter //
dan meluas ke akhir baris sumber. Komentar yang dibatasi dimulai dengan karakter /*
dan diakhir dengan karakter */
.
Komentar yang dibatasi dapat mencakup beberapa baris.
komentar:
komentar baris tunggal
komentar yang dibatasi
komentar baris tunggal:
//
memilih karakterkomentar baris tunggal
karakter komentar baris tunggal:
karakter-komentar-baris tunggal karakter-komentar-tunggal-karakter-komentar-memilih
karakter komentar baris tunggal:
Setiap karakter Unicode kecuali karakter baris baru
komentar yang dibatasi:
/*
tanda bintang opt tekskomentar yang dibatasi /
teks-komentar yang dibatasi:
delimited-comment-section delimited-comment-textopt
delimited-comment-section:
/
tanda bintangmemilih not-slash-or-asterisk
tanda bintang:
*
tanda bintangmemilih
not-slash-or-asterisk:
Setiap karakter Unicode kecuali *
atau /
Komentar tidak bersarang. Karakter berurutan /*
dan */
tidak memiliki arti khusus dalam komentar satu baris, dan urutan //
karakter dan /*
tidak memiliki arti khusus dalam komentar yang dibatasi.
Komentar tidak diproses dalam literal teks. Contoh
/* Hello, world
*/
"Hello, world"
menyertakan komentar yang dibatasi.
Contoh
// Hello, world
//
"Hello, world" // This is an example of a text literal
memperlihatkan beberapa komentar baris tunggal.
Token
Token adalah pengidentifikasi, kata kunci, harfiah, operator, atau tanda baca. Spasi kosong dan komentar digunakan untuk memisahkan token, tetapi tidak dianggap sebagai token.
tanda:
identifier
kata kunci
harfiah
operator-atau-punctuator
Urutan Escape Karakter
Nilai teks M dapat berisi karakter Unicode arbitrer. Namun, literal teks terbatas pada karakter grafis dan memerlukan penggunaan urutan escape untuk karakter non-grafis. Misalnya, untuk menyertakan karakter carriage-return, linefeed, atau tab dalam teks literal, #(cr)
urutan escape , , #(lf)
dan #(tab)
dapat digunakan. Untuk menyematkan karakter #(
mulai escapesequence dalam teks harfiah, karakter itu #
sendiri perlu diloloskan:
#(#)(
Urutan escape juga dapat berisi nilai titik kode Unicode pendek (empat digit heksa) atau panjang (delapan digit heksa). Oleh karena itu, tiga urutan escape berikut setara:
#(000D) // short Unicode hexadecimal value
#(0000000D) // long Unicode hexadecimal value
#(cr) // compact escape shorthand for carriage return
Beberapa kode escape dapat disertakan dalam satu urutan escape, dipisahkan oleh koma; dua urutan berikut dengan demikian setara:
#(cr,lf)
#(cr)#(lf)
Berikut ini menjelaskan mekanisme standar pelepasan karakter dalam dokumen M.
karakter-escape-sequence:
#(
escape-sequence-list )
escape-sequence-list:
urutan escape tunggal
single-escape-sequence ,
escape-sequence-list
urutan escape tunggal:
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 hex-digit
control-character-escape-sequence:
karakter kontrol
karakter kontrol:
cr
lf
tab
escape-escape:
#
Harfiah
Literal adalah representasi kode sumber dari nilai.
Harfiah:
logical-literal
angka harfiah
teks-literal
null-literal
verbatim-literal
Harfiah null
Harfiah null digunakan untuk menulis null
nilai. Nilai null
mewakili nilai yang tidak ada.
null-literal:
null
Literal logis
Literal logis digunakan untuk menulis nilai true
dan false
menghasilkan nilai logis.
logical-literal:
true
false
Jumlah harfiah
Angka harfiah digunakan untuk menulis nilai numerik dan menghasilkan nilai angka.
number-literal:
desimal-number-literal
heksadesimal-number-literal
desimal-number-literal:
desimal-digit .
desimal-digits eksponen-partopt
.
opt bagianeksponen digit desimal
opt bagianeksponen digit desimal
digit desimal:
opt digit desimal-digit desimal
digit desimal: salah satu dari
0 1 2 3 4 5 6 7 8 9
bagian eksponen:
e
tanda tanganiopt decimal-digits
E
tanda tanganiopt decimal-digits
sign: salah satu dari
+ -
heksadesimal-number-literal:
0x
hex-digits
0X
hex-digits
hex-digits:
hex-digit hex-digit memilih
hex-digit: salah satu
0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
Angka dapat ditentukan dalam format heksadesimal dengan mendahului hex-digit dengan karakter 0x
. Contohnya:
0xff // 255
Perhatikan bahwa jika titik desimal disertakan dalam angka harfiah, maka harus memiliki setidaknya satu digit mengikutinya. Misalnya, 1.3
adalah angka harfiah tetapi 1.
dan 1.e3
tidak.
Literal teks
Literal teks digunakan untuk menulis urutan karakter Unicode dan menghasilkan nilai teks.
text-literal:
"
opt karakter teks-literal "
karakter teks-literal:
teks-literal-character text-literal-charactersopt
text-literal-character:
karakter teks tunggal
karakter-escape-sequence
double-quote-escape-sequence
karakter teks tunggal:
Karakter apa pun kecuali "
(U+0022
) atau #
(U+0023
) diikuti oleh (
(U+0028
)
double-quote-escape-sequence:
""
(U+0022
, U+0022
)
Untuk menyertakan tanda kutip dalam nilai teks, tanda kutip diulang, sebagai berikut:
"The ""quoted"" text" // The "quoted" text
Produksi karakter-escape-sequence dapat digunakan untuk menulis karakter dalam nilai teks tanpa harus langsung mengodekannya sebagai karakter Unicode dalam dokumen. Misalnya, pengembalian pengangkutan dan umpan baris dapat ditulis dalam nilai teks sebagai:
"Hello world#(cr,lf)"
Harfiah verbatim
Harfiah verbatim digunakan untuk menyimpan urutan karakter Unicode yang dimasukkan oleh pengguna sebagai kode, tetapi tidak dapat diurai dengan benar sebagai kode. Pada runtime, ini menghasilkan nilai kesalahan.
verbatim-literal:
#!"
opt karakter teks-literal "
Identifiers
Pengidentifikasi adalah nama yang digunakan untuk merujuk ke nilai. Pengidentifikasi dapat berupa pengidentifikasi reguler atau pengidentifikasi yang dikutip.
Pengenal:
pengidentifikasi reguler
pengidentifikasi kutipan
pengidentifikasi reguler:
pengidentifikasi yang tersedia
pengidentifikasi-dot-character pengidentifikasi reguler yang tersedia
pengidentifikasi yang tersedia:
Kata kunci atau pengidentifikasi yang bukan kata kunci
kata kunci atau pengidentifikasi:
pengidentifikasi-start-character identifier-part-characteropt
identifier-start-character:
karakter huruf
karakter garis bawah
pengidentifikasi-sebagian-karakter:
pengidentifikasi-part-character identifier-part-characteropt
pengidentifikasi-bagian-karakter:
karakter huruf
karakter digit desimal
karakter garis bawah
menyambungkan-karakter
menggabungkan karakter
karakter pemformatan
karakter titik:
.
Aku akan menemuinya.U+002E
karakter garis bawah:
_
Aku akan menemuinya.U+005F
karakter huruf:
Karakter Unicode dari kelas Lu, Ll, Lt, Lm, Lo, atau Nl
menggabungkan karakter:
Karakter Unicode dari kelas Mn atau Mc
karakter digit desimal:
Karakter Unicode dari kelas Nd
menyambungkan karakter:
Karakter Unicode dari kelas Pc
karakter pemformatan:
Karakter Unicode dari kelas Cf
Pengidentifikasi yang dikutip dapat digunakan untuk mengizinkan urutan nol atau lebih karakter Unicode untuk digunakan sebagai pengidentifikasi, termasuk kata kunci, spasi kosong, komentar, operator, dan tanda baca.
pengidentifikasi kutipan:
#"
opt karakter teks-literal "
Perhatikan bahwa urutan escape dan tanda kutip ganda untuk meloloskan tanda kutip dapat digunakan dalam pengidentifikasi yang dikutip, sama seperti dalam teks-literal.
Contoh berikut menggunakan kutipan pengidentifikasi untuk nama yang berisi karakter spasi:
[
#"1998 Sales" = 1000,
#"1999 Sales" = 1100,
#"Total Sales" = #"1998 Sales" + #"1999 Sales"
]
Contoh berikut menggunakan kutipan pengidentifikasi untuk menyertakan +
operator dalam pengidentifikasi:
[
#"A + B" = A + B,
A = 1,
B = 2
]
Pengidentifikasi Umum
Ada dua tempat di M di mana tidak ada ambiguitas yang diperkenalkan oleh pengidentifikasi yang berisi kosong atau yang merupakan kata kunci atau literal angka. Tempat-tempat ini adalah nama bidang rekaman dalam rekaman harfiah dan di operator akses bidang ([ ]
) Di sana, M memungkinkan pengidentifikasi tersebut tanpa harus menggunakan pengidentifikasi yang dikutip.
[
Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]
]
Pengidentifikasi yang digunakan untuk memberi nama dan mengakses bidang disebut sebagai pengidentifikasi umum dan didefinisikan sebagai berikut:
pengidentifikasi umum:
generalized-identifier-part
pengidentifikasi umum hanya dipisahkan oleh kosong (U+0020
)
generalized-identifier-part
bagian pengidentifikasi umum:
generalized-identifier-segment
desimal-digit-character generalized-identifier-segment
generalized-identifier-segment:
kata kunci-atau-pengidentifikasi
kata kunci-atau-pengidentifikasi-kata kunci-karakter-atau-pengidentifikasi
Kata Kunci
Kata kunci adalah urutan karakter seperti pengidentifikasi yang dicadangkan, dan tidak dapat digunakan sebagai pengidentifikasi kecuali saat menggunakan mekanisme kutipan pengidentifikasi atau di mana pengidentifikasi umum diizinkan.
kata kunci: salah satu dari
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
Operator dan tanda baca
Ada beberapa jenis operator dan tanda baca. Operator digunakan dalam ekspresi untuk menjelaskan operasi yang melibatkan satu atau beberapa operan. Misalnya, ekspresi a + b
menggunakan +
operator untuk menambahkan dua operan a
dan b
. Tanda baca adalah untuk pengelompokan dan pemisahan.
operator-atau-punctuator: salah satu dari
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...