Lexikálna štruktúra

Dokumenty

Dokument jazyka M je zoradená postupnosť znakov Unicode. Jazyk M umožňuje rôzne triedy znakov Unicode v rôznych častiach dokumentu jazyka M. Informácie o triedach znakov Unicode nájdete v téme Štandard Unicode, verzia 3.0, časť 4.5.

Dokument obsahuje buď presne jeden výraz alebo skupiny definícií usporiadané do sekcií. Sekcie sú podrobne popísané v Kapitole 10. Koncepčne povedané, na prečítanie výrazu z dokumentu sa používajú nasledujúce kroky:

  1. Dokument sa dekóduje podľa jeho schémy kódovania znakov do postupnosti znakov Unicode.

  2. Vykoná sa lexikálna analýza, čím sa prúd znakov Unicode prelože do prúdu tokenov. Zostávajúce podsekcie tejto sekcie sa vzťahujú na lexikálnu analýzu.

  3. Vykoná sa syntaktická analýza, čím sa prúd tokenov preložije do tvaru, ktorý možno vyhodnotiť. Tento proces je popísaný v nasledujúcich sekciách.

Gramatické pravidlá

Lexikálne a syntaktické gramatiky sú prezentované pomocou gramatických produkcií. Každá gramatická výroba definuje nekonečný symbol a možné rozšírenia tohto netradiálneho symbolu do postupností nekonečných alebo koncových symbolov. V gramatických produkciách sa symboly non-terminal+ zobrazujú kurzívou a koncové symboly sa zobrazujú písmom s pevnou šírkou.

Prvým riadkom gramatickej produkcie je názov práve definovaného nekonzisťového symbolu, za ktorým nasleduje dvojbodka. Každá po sebe idúca zarážka čiary obsahuje možnú expanziu nekonečných symbolov uvedených ako postupnosť nekonečných alebo koncových symbolov. Napríklad produkcia:

if-expression:
      ifif-conditionthentrue-expressionelsefalse-expression

definuje výraz if-expression pozostávajúci z tokenu if, za ktorým nasleduje podmienka if-condition, za ktorou nasleduje token then, za ktorým nasleduje výraz true-expression, za ktorým nasleduje token else, za ktorým nasleduje výraz false-expression.

Keď existuje viac rozšírení nekonzisťového symbolu, alternatívy sú uvedené v samostatných riadkoch. Napríklad produkcia:

variable-list:
      premenná
      variable-list
,variable

definuje, že zoznam variable-list buď pozostáva z premennejalebo pozostáva zo zoznamu variable-list, za ktorým nasleduje premenná. Inými slovami, definícia je rekurzívna a určuje, že zoznam premenných pozostáva z jednej alebo viacerých premenných oddelených čiarkami.

Na označenie voliteľného symbolu sa používa indexovaná prípona "opt". Produkcia:

field-specification:
      optionalopt field-name=field-type

je skratka pre:

field-specification:
      field-name
=field-type
      optionalfield-name=field-type

a definuje field-specification, aby voliteľne začínala koncovým symbolom optional, za ktorým nasleduje field-name, koncový symbol =a field-type.

Alternatívy sú zvyčajne uvedené v samostatných riadkoch, aj keď v prípadoch, kde existuje veľa alternatív, zoznam rozšírení uvedených v jednom riadku môže predchádzať fráza "jeden z". Toto je jednoducho skratka pre každú alternatívu v samostatnom riadku. Napríklad produkcia:

decimal-digit: one of
      0 1 2 3 4 5 6 7 8 9

je skratka pre:

decimal-digit:
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9

Lexikálna analýza

Produkcia lexical-unit definuje lexikálnu gramatiku pre dokument jazyka M. Každý platný dokument jazyka M zodpovedá tejto gramatike.

lexikálna jednotka:
      opt lexical-elements
lexical-elements:
      lexical-element
      lexical-element
      lexical-elements
lexical-element:
      Medzery
      komentár tokenu

Na lexikálnej úrovni sa dokument jazyka M skladá zo streamu prázdnych znakov, komentára a prvkov tokenu . Každá z týchto produkcií je popísaná v nasledujúcich sekciách. V syntaktickej gramatike sú významné iba prvky tokenu .

prázdnych znakov.

Prázdne znaky sa používajú na oddelenie komentárov a tokenov v rámci dokumentu jazyka M. Prázdne znaky obsahujú znak medzery (ktorý je súčasťou triedy Unicode Zs), ako aj postupnosti znakov vodorovného a zvislého tabulátora, posunu riadka a nového riadka. Postupnosti znakov nového riadka obsahujú návrat na koniec riadka, posun riadka, návrat na koniec riadka, za ktorými nasleduje posun riadka, nasledujúci riadok a znaky oddeľovača odsekov.

prázdne znaky:
      Ľubovoľný znak s triedou Unicode Zs
      Znak vodorovného tabulátora (U+0009)
      Znak zvislého tabulátora (U+000B)
      Znak posunu riadka (U+000C)
      Znak návratu na koniec riadka (U+000D), za ktorým nasleduje znak posunu riadka (U+000A)
      new-line-character
new-line-character:
      Znak návratu na koniec riadka (U+000D)
      Znak posunu riadka (U+000A)
      Znak nasledujúceho riadka (U+0085)
      Znak oddeľovača riadkov (U+2028)
      Znak oddeľovača odsekov (U+2029)

Na účely kompatibility s nástrojmi na úpravu zdrojového kódu, ktoré pridávajú značky konca súboru, a na umožnenie, aby sa dokument zobrazoval ako postupnosť správne ukončených riadkov, sa na dokument jazyka M použijú nasledujúce transformácie:

  • Ak je posledným znakom dokumentu znak Control-Z (U+001A), tento znak sa odstráni.

  • Znak návratu na začiatok riadka (U+000D) sa pridá na koniec dokumentu, ak je tento dokument neprázdny a ak posledný znak dokumentu nie je znak návratu na začiatok riadka (U+000D), znak posunu riadka (U+000A), oddeľovač riadkov (U+2028) alebo oddeľovač odsekov (U+2029).

Vytvoril

Podporované sú dve formy komentárov: jednoriadkové komentáre a komentáre s oddeľovačmi. Jednoriadkové komentáre začínajú znakmi // a rozširujú sa na koniec zdrojového riadka. Komentáre s oddeľovačmi začínajú znakmi /* a končia znakmi */.

Komentáre s oddeľovačmi môžu obsahovať viacero riadkov.

Komentár:
      jednoriadkový komentár
      delimited-comment
single-line-comment:

      //opt single-line-comment-characters
single-line-comment-characters:
      single-line-comment-character single-line-comment-charactersopt
single-line-comment-character:

      Ľubovoľný znak Unicode okrem new-line-character
delimited-comment:

      /*hviezdičky typu delimited-comment-textopt/
delimited-comment-text:
      delimited-comment-section delimited-comment-textopt
delimited-comment-section:

      /
      hviezdičky opt not-slash-or-asterisk
Hviezdičky:

      *explicitný súhlas so hviezdičkami
not-slash-or-asterisk:

      Ľubovoľný znak Unicode okrem * alebo /

Komentáre sa nevnárajú. Postupnosti /* znakov a */ nemajú v jednoriadkovom komentári žiadny zvláštny význam a postupnosti // znakov a /* nemajú v komentári s oddeľovačmi žiadny zvláštny význam.

Komentáre sa nespracujú v rámci textových literálov. V príklade

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

je zahrnutý komentár s oddeľovačmi.

V príklade

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

je niekoľko jednoriadkových komentárov.

Žetóny

Token je identifikátor, kľúčové slovo, literál, operátor alebo interpunkčné znamienko. Prázdne znaky a komentáre sa používajú na oddelenie tokenov, nepovažujú sa za tokeny.

Token:
      identifikátor
      Kľúčové slovo
      Doslovný
      operator-or-punctuator

Koncové postupnosti znakov

Textové hodnoty jazyka M môžu obsahovať ľubovoľné znaky Unicode. Textové literáky sú však obmedzené na grafické znaky a pre negrafičné znaky vyžadujú použitie koncových postupností . Ak chcete napríklad do textového literálu zahrnúť znak návratu na koniec riadka, tabulátora riadka alebo tabulátora, #(cr)možno použiť koncové postupnosti , #(lf)#(tab) resp. . Ak chcete vložiť počiatočné znaky #( koncovej postupky v textovom literáli, # samotný musí byť na konci:

#(#)(

Koncové postupnosti môžu tiež obsahovať krátke (štyri hexadecimály) alebo dlhé (osem hexadecimálnych číslic) hodnoty bodu kódu Unicode. Nasledujúce tri koncové postupnosti sú teda rovnocenné:

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

Viacero koncových kódov možno zahrnúť do jednej únikovej postupnosti oddelenej čiarkami; Nasledujúce dve postupnosti sú teda rovnocenné:

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

Nasleduje popis štandardného mechanizmu koncového znaku v dokumente jazyka M.

character-escape-sequence:
      #(escape-sequence-list)
escape-sequence-list:
      jedno-úniková postupnosť
      single-escape-sequence
,escape-sequence-list
jedno-úniková postupnosť:
      dlhá sekvencia unicode-escape-sequence
      krátky-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 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
únik:
      #

Literály

Literál je reprezentácia zdrojového kódu hodnoty.

Doslovný:
      logický literál
      number-literal
      text-literal
      literál null-literal
      verbatim-literal

Literáky null

Literál null sa používa na zápis null hodnoty . Hodnota null reprezentuje chýbajúnú hodnotu.

null-literal:
      null

Logické literáli

Logický literál sa používa na zápis hodnôt true a false a na vytvorenie logickej hodnoty.

logical-literal:
      true
      false

Číselné literáli

Číselná hodnota sa používa na zápis číselnej hodnoty a vytvorí číselnú hodnotu.

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:
one of
      0 1 2 3 4 5 6 7 8 9
exponent-part:
      esignopt decimal-digits
      Esignopt decimal-digits
sign:
one of
      + -
hexadecimal-number-literal:
      0xhex-digits (hex-digits)
      0Xhex-digits (hex-digits)
hex-digits:
      hex-digit hex-digitsopt
hex-digit:
one of
      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

Číslo možno zadať v šestnástkovom formáte tak, že sa pred neho dostanú hex-digits so znakmi 0x. Napríklad:

0xff // 255

Všimnite si, že ak v číselnom literáli uvedená desatinná čiarka, potom musí za ňou nasleduje aspoň jedna číslica. Napríklad je číselný literál, 1.3 ale 1. a 1.e3 nie sú.

Textové literáky

Textový literál sa používa na zápis postupnosti znakov Unicode a vytvorí textovú hodnotu.

text-literal:
      "opt text-literal-characters"
text-literal-characters:
      text-literal-character text-literal-charactersopt
text-literal-character:
      single-text-character
      sekvencia koncového znaku
      dvojitá úvodzovka-úniková postupnosť
single-text-character:

      Ľubovoľný znak okrem " (U+0022) alebo # (U+0023), za ktorým ( nasleduje (U+0028)
dvojitá úvodzovka-úniková postupnosť:
      "" (U+0022, U+0022)

Ak chcete do textovej hodnoty zahrnúť úvodzovky, značka úvodzovky sa zopakuje nasledovne:

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

Produkcia koncového znaku postupnosti sa dá použiť na zápis znakov v textových hodnotách bez toho, aby ste ich museli priamo kódovať ako znaky Unicode v dokumente. Napríklad návrat na koniec riadka a posun riadka možno zapísať v textovej hodnote ako:

"Hello world#(cr,lf)"

Doslovné literáky

Doslovný literál sa používa na uloženie sekvencie znakov Unicode, ktoré používateľ zadal ako kód, ale ktoré sa nedajú správne analyzovať ako kód. V režime runtime sa vyprodukuje chybová hodnota.

verbatim-literal:
      #!"opt text-literal-characters"

Identifiers

Identifikátor je názov, ktorý sa používa na odkazovanie na hodnotu. Identifikátory môžu byť buď regulárne identifikátory alebo citované identifikátory.

Identifikátor:
      regular-identifier
      quoted-identifier
regular-identifier:
      available-identifier
      available-identifier dot-character regular-identifier
available-identifier:

      Kľúčové slovo-alebo-identifikátor, ktorý nie je kľúčovým slovom
keyword-or-identifier:
      identifier-start-character identifier-part-charactersopt
identifier-start-character:
      letter-character
      znak podčiarknutia
identifier-part-characters:
      identifier-part-character identifier-part-charactersopt
identifier-part-character:
      letter-character
      decimal-digit-character
      znak podčiarknutia
      connecting-character
      combining-character
      formatting-character
dot-character:

      . (U+002E)
znak podčiarknutia:
      _ (U+005F)
letter-character:
      Znak Unicode tried Lu, Ll, Lt, LM, Lo alebo Nl
combining-character:
      Znak Unicode tried Mn alebo Mc
decimal-digit-character:
      Znak Unicode triedy Nd
connecting-character:
      Znak Unicode triedy Pc
formatting-character:
      Znak Unicode triedy Cf

Identifikátor quoted-identifier možno použiť na povolenie akejkoľvek postupnosti nula alebo viacerých znakov Unicode, ktoré sa majú použiť ako identifikátor, vrátane kľúčových slov, prázdnych znakov, komentárov, operátorov a interpunkčných zrušiek.

quoted-identifier:
      #"opt text-literal-characters"

Všimnite si, že koncové postupnosti a úvodzovky na koncové úvodzovky možno použiť v citovanom identifikátore, rovnako ako v literáli text-literal.

V nasledujúcom príklade sa používa identifikátor citujúci názvy obsahujúce znak medzery:

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

Nasledujúci príklad používa identifikátor citujúci zahrnutie operátora do + identifikátora:

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

Zovšeobecnené identifikátory

V jazyku M existujú dve miesta, kde identifikátory, ktoré obsahujú prázdne hodnoty, alebo ktoré sú inými kľúčovými slovami alebo číselnými literálmi, nezaviedli žiadne nejednoznačnosti. Tieto miesta sú názvy polí záznamu v literáli záznamu a v operátore prístupu k poľu ([ ]). Tu jazyk M povoľuje takéto identifikátory bez toho, aby bolo potrebné použiť citované identifikátory.

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

Identifikátory používané na pomenovanie a prístup k poliam sa označujú ako zovšeobecnené identifikátory a sú definované takto:

generalized-identifier:
      generalized-identifier-part
      generalized-identifier
oddelené iba prázdnymi znakmi (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

Kľúčové slová

Kľúčové slovo je postupnosť identifikátorom like znakov, ktorá je vyhradená, a nemožno ju použiť ako identifikátor, okrem prípadu, keď sa použije mechanizmus citovania identifikátorom alebo keď je povolený zovšeobecnený identifikátor.

kľúčové slovo: jedno zo
       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

Operátory a interpunkčné zrnášky

Existuje niekoľko druhov operátorov a interpunkčné znamienko. Operátory sa používajú vo výrazoch na popis operácií zahrňujújúcich jeden alebo viac operandov. Napríklad výraz a + b pomocou operátora + pridá dva operandy a a b. Interpunkčné zmätky sa používajú na zoskupovanie a oddeľovanie.

operator-or-punctuator: jedno zo
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...