Sözcük Temelli Yapı

Belgeler

M belgesi , sıralı bir Unicode karakter dizisidir. M, bir M belgesinin farklı bölümlerinde farklı Unicode karakter sınıfları sağlar. Unicode karakter sınıfları hakkında bilgi için bkz . Unicode Standart, Sürüm 3.0, bölüm 4.5.

Belge tam olarak bir ifadeden veya bölümler halinde düzenlenmiş tanım gruplarından oluşur. Bölümler Bölüm 10'da ayrıntılı olarak açıklanmıştır. Kavramsal olarak ifadeyi belgeden okumak için aşağıdaki adımlar kullanılır:

  1. Belgenin kodu, karakter kodlama düzenine göre unicode karakter dizisine dönüştürülür.

  2. Sözcük temelli analiz gerçekleştirilir, böylece Unicode karakterlerin akışı bir belirteç akışına dönüştürülür. Bu bölümün kalan alt bölümleri sözcük temelli analizi kapsar.

  3. Söz dizimsel analiz gerçekleştirilir ve böylece belirteç akışı değerlendirilebilecek bir forma dönüştürülür. Bu işlem sonraki bölümlerde ele alınmıştır.

Dil bilgisi kuralları

Sözcük temelli ve yazımsal dil bilgisi, dil bilgisi üretimleri kullanılarak sunulur. Her dil bilgisi üretimi, terminal dışı bir simge ve bu terimsiz simgenin olası genişletmelerini terminal dışı veya terminal olmayan sembol dizilerine tanımlar. Dil bilgisi üretimlerinde, terminal+ olmayan simgeler italik türde, terminal simgeleri ise sabit genişlikli yazı tipinde gösterilir.

Bir dil bilgisi üretiminin ilk satırı, tanımlanmakta olan terminal dışı sembolün adıdır ve sonuna iki nokta eklenir. Ardışık girintili her satır, terminal dışı veya terminal olmayan simgelerin dizisi olarak verilen terim dışının olası bir genişlemesini içerir. Örneğin, şu üretim:

if-ifadesi:
      ifif-conditionthentrue-expressionelsefalse-expression

, belirteciniif, ardından bir if-koşulu ve ardından belirtecithen, ardından bir true-ifadesi ve ardından belirteci elseve ardından bir yanlış ifadeyi içeren bir if-ifadesi tanımlar.

Terminal dışı bir sembolün birden fazla olası genişletmesi olduğunda, alternatifler ayrı satırlarda listelenir. Örneğin, şu üretim:

değişken listesi:
      değişken
      değişken-liste
,değişkeni

bir değişken-listesi tanımlar veya bir değişken-listesi ve ardından bir değişkenden oluşur. Başka bir deyişle tanım özyinelemeli olur ve bir değişken listesinin virgülle ayrılmış bir veya daha fazla değişkenden oluştuğunun belirtiliyor.

İsteğe bağlı bir simgeyi belirtmek için alt simgeli "opt" soneki kullanılır. Üretim:

alan belirtimi:
      optionalopt alan-adı=alan-türü

şunun kısaltmasıdır:

alan belirtimi:
      alan-adı
=alan-türü
      optionalalan-adı=alan-türü

ve isteğe bağlı olarak terminal simgesi optional ve ardından bir alan-adı, terminal simgesi =ve alan türü ile başlamak için bir alan belirtimi tanımlar.

Alternatifler normalde ayrı satırlarda listelenir, ancak birçok alternatifin bulunduğu durumlarda , "biri" tümceciği tek bir satırda verilen genişletmeler listesinden önce gelebilir. Bu, alternatiflerin her birini ayrı bir satırda listelemek için basit bir kısaltmadır. Örneğin, şu üretim:

ondalık basamak: biri
      0 1 2 3 4 5 6 7 8 9

şunun kısaltmasıdır:

ondalık basamak:
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9

Sözcük Temelli Analiz

Sözcük temelli birim üretimi, bir M belgesi için sözcüksel dil bilgisini tanımlar. Geçerli her M belgesi bu dil bilgisi ile uyumlu.

sözcüksel birim:
      sözcük temelli öğelertercihi
sözcük temelli öğeler:
      sözcük temelli öğe
      sözcük temelli öğe
      sözcük temelli öğeler
sözcük temelli öğe:
      boşluk
      belirteç açıklaması

Sözcük düzeyinde, M belgesi boşluk, açıklama ve belirteç öğeleri akışından oluşur. Bu üretimlerin her biri aşağıdaki bölümlerde ele alınmıştır. Yalnızca belirteç öğeleri, yazım bilgisi açısından önemlidir.

Boşluk

Boşluk, bir M belgesi içindeki açıklamaları ve belirteçleri ayırmak için kullanılır. Boşluk, boşluk karakterini (Unicode sınıf Z'lerinin parçası olan) yanı sıra yatay ve dikey sekmeyi, form akışını ve yeni satır karakteri dizilerini içerir. Yeni satır karakter dizileri satır başı, satır besleme, satır başı ve ardından satır besleme, sonraki satır ve paragraf ayırıcı karakterleri içerir.

boşluk:
      Unicode sınıf Z'leri olan herhangi bir karakter
      Yatay sekme karakteri (U+0009)
      Dikey sekme karakteri (U+000B)
      Form akışı karakteri (U+000C)
      Satır başı karakteri (U+000D) ve ardından satır besleme karakteri (U+000A)
      yeni satır karakteri
new-line-character:
      Satır başı karakteri (U+000D)
      Satır besleme karakteri (U+000A)
      Sonraki satır karakteri (U+0085)
      Çizgi ayırıcı karakteri (U+2028)
      Paragraf ayırıcı karakteri (U+2029)

Dosya sonu işaretçileri ekleyen kaynak kodu düzenleme araçlarıyla uyumluluk sağlamak ve bir belgenin düzgün şekilde sonlandırılan satırlar dizisi olarak görüntülenmesini sağlamak için, aşağıdaki dönüştürmeler sırayla bir M belgesine uygulanır:

  • Belgenin son karakteri bir Control-Z karakteri ()U+001A ise, bu karakter silinir.

  • Belge boş değilse ve belgenin son karakteri satır başı (U+000D), satır beslemesi (), satır ayırıcısı (U+000A) veya paragraf ayırıcısı (U+000D) değilse, belgenin sonuna satır başı karakteri (U+2028U+2029) eklenir.

Açıklamalar

İki açıklama biçimi desteklenir: tek satırlı açıklamalar ve sınırlandırılmış açıklamalar. Tek satırlı açıklamalar karakterlerle // başlar ve kaynak satırın sonuna kadar uzanır. Sınırlandırılmış açıklamalar karakterlerle /* başlar ve karakterleriyle */biter.

Sınırlandırılmış açıklamalar birden çok satıra yayılabilir.

Yorum:
      tek satırlı açıklama
      sınırlandırılmış açıklama
tek satırlı açıklama:

      //tek satırlı-açıklama-karakterlerseç
tek satırlı açıklama karakterleri:
      tek satırlı-açıklama-karakteri tek satır-açıklama-karakterleriseç
tek satırlı açıklama-karakteri:

      Yeni satır karakteri dışında herhangi bir Unicode karakteri
sınırlandırılmış açıklama:

      /*delimited-comment-textopt yıldız işareti/
sınırlandırılmış-açıklama-metni:
      delimited-comment-section delimited-comment-textopt
delimited-comment-section:

      /
      yıldız işaretitercihi eğik çizgi veya yıldız işareti değil
Yıldız:

      *yıldız işareti tercihi
eğik çizgi veya yıldız işareti değil:

      veya dışında * herhangi bir Unicode karakteri /

Açıklamalar iç içe yerleştirilmiyor. /* ile */ karakter dizilerinin tek satırlı bir açıklama içinde ve // ile /* karakter dizilerinin de sınırlandırılmış bir açıklama içinde özel bir anlamı yoktur.

Açıklamalar metin değişmez değerleri içinde işlenmez. Örnek

/* Hello, world 
*/ 
    "Hello, world"

sınırlandırılmış bir açıklama içerir.

Örnek

// Hello, world 
// 
"Hello, world" // This is an example of a text literal

birkaç tek satırlı açıklama gösterir.

Belirteçler

Belirteç bir tanımlayıcı, anahtar sözcük, değişmez değer, işleç veya noktalama işaretidir. Boşluk ve açıklamalar belirteçleri ayırmak için kullanılır, ancak belirteç olarak kabul edilmez.

Belirte -ci:
      identifier
      Anahtar kelime
      değişmez değer
      işleç veya noktalama işareti

Karakter Kaçış Dizileri

M metin değerleri rastgele Unicode karakterler içerebilir. Ancak metin değişmez değerleri grafik karakterlerle sınırlıdır ve grafik olmayan karakterler için kaçış dizileri kullanılmasını gerektirir. Örneğin, metin değişmez değerine satır başı, satır besleme veya sekme karakteri eklemek için sırasıyla #(cr), #(lf)ve #(tab) kaçış dizileri kullanılabilir. Escapesequence başlangıç karakterlerini #( metin değişmez değerine eklemek için kaçış # karakterinden kaçılması gerekir:

#(#)(

Kaçış dizileri kısa (dört onaltılık basamak) veya uzun (sekiz onaltılık basamak) Unicode kod noktası değerleri de içerebilir. Bu nedenle aşağıdaki üç kaçış dizisi eşdeğerdir:

#(000D)     // short Unicode hexadecimal value 
#(0000000D) // long Unicode hexadecimal value 
#(cr)       // compact escape shorthand for carriage return

Birden çok kaçış kodu, virgülle ayrılmış tek bir kaçış dizisine dahil edilebilir; bu nedenle aşağıdaki iki dizi eşdeğerdir:

#(cr,lf) 
#(cr)#(lf)

Aşağıda, bir M belgesinde karakter kaçışının standart mekanizması açıklanmaktadır.

character-escape-sequence:
      #(escape-sequence-list)
escape-sequence-list:
      tek kaçış dizisi
      tek kaçış-dizisi
,escape-sequence-list
tek kaçış dizisi:
      long-unicode-escape-sequence
      short-unicode-escape-sequence
      control-character-escape-sequence
      kaçış-kaçış
long-unicode-escape-sequence:
      onaltılık basamaklı onaltılık basamaklı onaltılık basamak onaltılık onaltılık basamak
short-unicode-escape-sequence:
      onaltılık basamaklı onaltılık basamaklı onaltılık basamak
control-character-escape-sequence:
      control-character
control-character:

      cr
      lf
      tab
kaçış-kaçış:
      #

Değişmez Değerler

Değişmez değer, bir değerin kaynak kodu gösterimidir.

Literal:
      mantıksal değişmez değer
      sayı değişmez değeri
      metin değişmez değeri
      null-değişmez değer
      verbatim-literal

Null değişmez değerler

Null değişmez değer değeri yazmak null için kullanılır. değer null , eksik bir değeri temsil eder.

null-değişmez değer:
      null

Mantıksal değişmez değerler

Mantıksal değişmez değer, değerleri true yazmak için kullanılır ve false mantıksal bir değer üretir.

mantıksal-değişmez değer:
      true
      false

Sayı değişmez değerleri

Sayı değişmez değeri, sayısal bir değer yazmak için kullanılır ve bir sayı değeri üretir.

sayı değişmez değeri:
      ondalık-sayı-değişmez değeri
      onaltılık-sayı-değişmez değeri
ondalık-sayı-değişmez değeri:
      ondalık basamaklar
.ondalık basamaklar üstel-bölümtercihi
      .ondalık basamaklar üs bölümütercihi
      ondalık basamaklar üs bölümütercihi
ondalık basamaklar:
      ondalık-basamak ondalık-basamaklaropt
ondalık basamak:
biri
      0 1 2 3 4 5 6 7 8 9
üs bölümü:
      esignopt decimal-digits
      Esignopt decimal-digits
sign:
biri
      + -
onaltılık-sayı-değişmez değeri:
      0xonaltılık basamaklar
      0Xonaltılık basamaklar
onaltılık basamaklar:
      onaltılık basamaklı onaltılık basamaklaropt
onaltılık basamak:
biri
      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

Bir sayı, onaltılık basamakların önüne karakterleriyle 0xeklenerek onaltılık biçimde belirtilebilir. Örnek:

0xff // 255

Ondalık nokta bir sayı değişmez değerine dahil edilirse, bunu izleyen en az bir basamak olması gerektiğini unutmayın. Örneğin, 1.3 bir sayı değişmez değeridir ancak 1.1.e3 değişmezdir.

Metin değişmez değerleri

Metin değişmez değeri, Unicode karakter dizisi yazmak için kullanılır ve bir metin değeri oluşturur.

metin değişmez değeri:
      "text-literal-charactersopt"
text-literal-characters:
      text-literal-character text-literal-charactersopt
metin-değişmez-karakteri:
      tek metinli karakter
      character-escape-sequence
      çift tırnak-kaçış dizisi
tek metin karakterli:

      () veya # (U+0022U+0023) dışında " ve ardından ( (U+0028) gelen herhangi bir karakter
double-quote-escape-sequence:
      "" (U+0022, U+0022)

Metin değerine tırnak işaretleri eklemek için, tırnak işareti aşağıdaki gibi yinelenir:

"The ""quoted"" text" // The "quoted" text

Karakter kaçış dizisi üretimi, doğrudan belgedeki Unicode karakterleri olarak kodlamak zorunda kalmadan metin değerlerinde karakter yazmak için kullanılabilir. Örneğin, satır başı ve satır beslemesi bir metin değerinde şöyle yazılabilir:

"Hello world#(cr,lf)"

Düz metin değişmez değerleri

Bir kullanıcı tarafından kod olarak girilen ancak kod olarak doğru şekilde ayrıştırılamayan Unicode karakter dizisini depolamak için düz metin değişmez değeri kullanılır. Çalışma zamanında bir hata değeri üretir.

verbatim-literal:
      #!"text-literal-charactersopt"

Tanımlayıcılar

Tanımlayıcı, bir değere başvurmak için kullanılan addır. Tanımlayıcılar normal tanımlayıcılar veya tırnak içine alınmış tanımlayıcılar olabilir.

Tanımlayıcı:
      normal tanımlayıcı
      quoted-identifier
normal tanımlayıcı:
      available-identifier
      kullanılabilir-tanımlayıcı nokta karakter normal-tanımlayıcı
available-identifier:

      Anahtar sözcük olmayan anahtar sözcük veya tanımlayıcı
anahtar sözcük veya tanımlayıcı:
      identifier-start-character identifier-part-charactersopt
identifier-start-character:
      harf karakteri
      alt çizgi-karakter
identifier-part-characters:
      identifier-part-character identifier-part-charactersopt
identifier-part-character:
      harf karakteri
      ondalık basamak-karakter
      alt çizgi-karakter
      bağlantı karakteri
      combining-character
      biçimlendirme karakteri
nokta karakteri:

      . (U+002E)
underscore-character:
      _ (U+005F)
harf karakteri:
      Lu, Ll, Lt, Lm, Lo veya Nl sınıflarının Unicode karakteri
combining-character:
      Mn veya Mc sınıflarının Unicode karakteri
decimal-digit-character:
      Nd sınıfının Unicode karakteri
connecting-character:
      Pc sınıfının Unicode karakteri
biçimlendirme karakteri:
      Cf sınıfının Unicode karakteri

Anahtar sözcükler, boşluklar, açıklamalar, işleçler ve noktalama işaretleri dahil olmak üzere sıfır veya daha fazla Unicode karakterden oluşan herhangi bir dizinin tanımlayıcı olarak kullanılmasına izin vermek için tırnak içinde tanımlayıcı kullanılabilir.

quoted-identifier:
      #"text-literal-charactersopt"

Kaçış dizilerinin ve kaçış tırnaklarına çift tırnak işaretleri, metin değişmez değerlerindeki gibi tırnak içine alınmış bir tanımlayıcıda da kullanılabilir.

Aşağıdaki örnekte boşluk karakteri içeren adlar için tanımlayıcı alıntısı kullanılır:

[ 
    #"1998 Sales" = 1000, 
    #"1999 Sales" = 1100, 
    #"Total Sales" = #"1998 Sales" + #"1999 Sales"
]

Aşağıdaki örnek, işleci bir tanımlayıcıya eklemek + için tanımlayıcı alıntısını kullanır:

[ 
    #"A + B" = A + B, 
    A = 1, 
    B = 2 
]

Genelleştirilmiş Tanımlayıcılar

M'de boşluk içeren veya başka bir şekilde anahtar sözcükler veya sayı değişmez değerleri olan tanımlayıcılar tarafından belirsizliklerin kullanılmadığı iki yer vardır. Bu yerler, kayıt değişmez değeri ve alan erişim işlecindeki () kayıt alanlarının adlarıdır ([ ]) Burada, M bu tür tanımlayıcıların tırnak içinde tanımlayıcılar kullanmak zorunda kalmadan kullanılmasına izin verir.

[ 
    Data = [ Base Line = 100, Rate = 1.8 ], 
    Progression = Data[Base Line] * Data[Rate]
]

Alanları adlandırmak ve erişmek için kullanılan tanımlayıcılar genelleştirilmiş tanımlayıcılar olarak adlandırılır ve aşağıdaki gibi tanımlanır:

genelleştirilmiş tanımlayıcı:
      genelleştirilmiş-tanımlayıcı-bölümü
      yalnızca boşluklarla ayrılmış genelleştirilmiş tanımlayıcı
(U+0020)
genelleştirilmiş-tanımlayıcı-bölümü
generalized-identifier-part:
      genelleştirilmiş-tanımlayıcı-segment
      decimal-digit-character generalized-identifier-segment
genelleştirilmiş-tanımlayıcı-segment:
      anahtar sözcük veya tanımlayıcı
      anahtar sözcük-veya-tanımlayıcı nokta karakter anahtar sözcük-veya-tanımlayıcı

Anahtar sözcükler

Anahtar sözcük, ayrılmış tanımlayıcı benzeri bir karakter dizisidir ve tanımlayıcı alıntı mekanizmasının kullanılması veya genelleştirilmiş bir tanımlayıcıya izin verilmediği durumlar dışında tanımlayıcı olarak kullanılamaz.

anahtar sözcük: biri
       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

İşleçler ve noktalama işaretleri

Çeşitli işleçler ve noktalama işaretleri vardır. İşleçler, bir veya daha fazla işlenen içeren işlemleri açıklamak için ifadelerde kullanılır. Örneğin a + b ifadesi, iki işleneni (a ve b) toplamak için + işlecini kullanır. Noktalama işaretleri gruplandırma ve ayırmaya yöneliktir.

işleç veya noktalama işareti: şunlardan biri
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...