Bagikan melalui


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:

  1. Dokumen didekodekan sesuai dengan skema pengodean karakternya ke dalam urutan karakter Unicode.

  2. Analisis leksikal dilakukan, sehingga menerjemahkan aliran karakter Unicode ke dalam aliran token. Subbagian yang tersisa dari bagian ini mencakup analisis leksikal.

  3. 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:
      ifif-condition then true-expressionelsefalse-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:
      optionalopt field-name = field-type

singkatan untuk:

spesifikasi bidang:
      jenis bidang nama
= bidang
      optionalnama = 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:
      etanda tanganiopt decimal-digits
      Etanda tanganiopt decimal-digits
sign:
salah satu dari
      + -
heksadesimal-number-literal:
      0xhex-digits
      0Xhex-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
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...