Sanastollinen rakenne

Tiedostot

M-asiakirja on järjestetty Unicode-merkkien sarja. M sallii eri Unicode-merkkien luokat M-asiakirjan eri osissa. Lisätietoja Unicode-merkkiluokista on kohdassa Unicode-standardi, versio 3.0, osio 4.5.

Asiakirja koostuu tarkalleen yhdestä lausekkeesta tai määritelmien ryhmistä, jotka on järjestetty osioihin. Osiot on kuvattu yksityiskohtaisesti luvussa 10. Konseptuaalisesti seuraavia vaiheita käytetään lauseen lukemiseen asiakirjasta:

  1. Asiakirja koodataan sen mukaan, mikä on sen merkkikoodausmalli Unicode-merkkien sarjaan.

  2. Sanastollinen analyysi suoritetaan, jolloin Unicode-merkkien tietovirta muunnetaan tunnusten tietovirraksi. Tämän osion jäljellä olevat alaosat kattavat sanastollisen analyysin.

  3. Syntaktinen analyysi suoritetaan, jolloin tunnusten tietovirta muunnettuna arvioitavaan muotoon. Tätä prosessia käsitellään seuraavissa osioissa.

Kielioppikäytänteet

Sanastolliset ja syntaktiset kieliopit on esitelty kielioppituotantojen avulla. Jokainen kielioppituotanto määrittää muun kuin päätesymbolin ja tämän nonterminal-symbolin mahdolliset laajennukset pääte- tai muihin kuin päätesymboleihin. Kielioppituotantojen terminaaliset+ symbolit näkyvät kursivoituina, ja päätteen symbolit näkyvät kiinteällä fontilla.

Kielioppituotannon ensimmäinen rivi on määritettävän muun kuin päätesymbolin nimi, jonka perässä on kaksoispiste. Jokainen peräkkäinen sisennysrivi sisältää mahdollisen nonterminal-laajennuksen, joka on annettu nonterminal- tai terminal-symbolien sarjana. Esimerkiksi tuotanto

if-expression:
      ifif-conditionthentrue-expressionelsefalse-expression

määrittää, että if-expression koostuu tunnuuksesta if, jota seuraa if-condition, jota seuraa tunnus then, jota seuraa true-expression, jota seuraa tunnus else, jota seuraa false-expression.

Jos muun kuin päätesymbolin laajennukseen on useita vaihtoehtoja, vaihtoehdot luetellaan erillisillä riveillä. Esimerkiksi tuotanto

variable-list:
      muuttuja
      variable-list-muuttuja
,

määrittää, että variable-list sisältää joko muuttujantai variable-list-luettelon, jota seuraa muuttuja. Toisin sanoen määritys on rekursiivinen ja määrittää, että muuttujaluettelo koostuu yhdestä tai useammasta muuttujasta pilkuilla eroteltuna.

Alaindeksoitua liitettä "opt" käytetään ilmaisemaan valinnainen symboli. Tuotanto:

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

ilmaisee lyhyesti seuraavan:

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

ja määrittää, että field-specification voi myös alkaa päätesymbolilla optional , jota seuraa field-name, päätesymboli =ja field-type.

Vaihtoehdot luetellaan yleensä erillisillä riveillä, vaikka tapauksissa, joissa vaihtoehtoja on paljon, ilmaisu "one of" voi edeltää yhdellä rivillä annettua laajennusluetteloa. Tämä on vain lyhenne kunkin vaihtoehdon luetteloinnista erilliselle riville. Esimerkiksi tuotanto

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

ilmaisee lyhyesti seuraavan:

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

Sanastollinen analyysi

lexical-unit-tuotanto määrittää M-asiakirjan sanastollisen kieliopin. Jokainen kelvollinen M-asiakirja noudattaa tätä kielioppia.

lexical-unit:
      lexical-elementsopt
lexical-elements:
      lexical-element
      lexical-element
      lexical-elements
lexical-element:
      whitespace
      Tunnuksen kommentti

Sanastotasolla M-asiakirja sisältää tietovirran välilyönnin, kommentin ja tunnuksen elementeistä. Kutakin näistä tuotannoista käsitellään seuraavissa osioissa. Vain tunnus-elementit ovat merkityksellisiä syntaktisessa kieliopissa.

Tyhjä tila

Välilyönnin avulla erotetaan kommentit ja tunnukset M-asiakirjan sisällä. Välilyönti sisältää välilyöntimerkin (joka on osa Unicoden Zs-luokkaa) sekä vaaka- ja pystysuuntaiset välilehdet, lomakkeen syötön ja uuden rivin merkkijonot. Uuden rivin merkkisekvenssejä ovat rivinvaihto, rivin syöttö, rivinvaihto ja sen jälkeen rivin syöte, seuraava rivi ja kappaleen erotinmerkit.

välilyönnit:
      Mikä tahansa merkki, jolla on Unicode-luokka Zs
      Vaakasuuntaisen sarkaimen merkki (U+0009)
      Pystysuuntaisen sarkaimen merkki (U+000B)
      Lomakkeen syöttömerkki (U+000C)
      Rivinvaihdon merkki (U+000D) ja sen jälkeen rivin syöttömerkki (U+000A)
      new-line-character
new-line-character:
      Rivinvaihdon merkki (U+000D)
      Rivinsyötön merkki (U+000A)
      Seuraavan rivin merkki (U+0085)
      Rivierottimen merkki (U+2028)
      Kappale-erottimen merkki (U+2029)

Jotta yhteensopivuus lähdekoodin muokkaustyökalujen kanssa, jotka lisäävät tiedoston lopun merkintöjä, ja jotta asiakirjaa voidaan pitää oikein lopetettujen rivien sekvenssinä, käytetään seuraavia muunnoksia M-asiakirjaan:

  • Jos asiakirjan viimeinen merkki on Control-Z-merkki (U+001A), tämä merkki poistetaan.

  • Rivinvaihdon merkki (U+000D) lisätään asiakirjan loppuun, jos asiakirja ei ole tyhjä ja jos tiedoston viimeinen merkki ei ole rivinvaihto (U+000D), rivin syöte (U+000A), rivierotin (U+2028) tai kappale-erotin (U+2029).

Kommentit

Kahta kommenttimuotoa tuetaan: yksiriviset kommentit ja erotinmerkkejä erotetut kommentit. Yksiriviset kommentit alkavat merkeillä // ja ulottuvat lähderivin loppuun. Erotetut kommentit alkavat merkeillä /* ja päättyvät merkkeihin */.

Eroteltujen kommenttien koko voi ulottua useille riveille.

Kommentti:
      yksirivinen kommentti
      delimited-comment
single-line-comment:

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

      Mikä tahansa Unicode-merkki paitsi new-line-character
delimited-comment:

      /*delimited-comment-textopt asterisks/
delimited-comment-text:
      delimited-comment-section delimited-comment-textopt
delimited-comment-section:

      /
      asterisksopt not-slash-or-asterisk
Tähti:

      *tähtiävalitsemalla
not-slash-or-asterisk:

      Mikä tahansa Unicode-merkki paitsi * tai /

Kommentit eivät ole sisäkkäin. Peräkkäisillä merkeillä /* ja */ ei ole mitään erityistä merkitystä single-line-comment-arvon sisällä eikä peräkkäisillä merkeillä // ja /* ole mitään erityistä merkitystä erotinmerkeillä erotellun kommentin sisällä.

Kommentit eivät käsittele tekstiliteraalien sisällä. Esimerkki

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

sisältää erotellun kommentin.

Esimerkki

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

näyttää useita yksiriviisiä kommentteja.

Rahakkeita

Tunnus on tunniste, avainsana, literaali, operaattori tai erotin. Välilyönnin ja kommenttien avulla erotellaan tunnukset, mutta niitä ei pidetä tunnuksina.

Tunnussanoma:
      Tunnus
      Avainsanan
      Kirjaimellinen
      operator-or-punctuator

Merkkien tilanvaihdot

M-tekstiarvot voivat sisältää mielivaltaisia Unicode-merkkejä. Tekstiliteraalit on kuitenkin rajoitettu graafisiin merkkeihin, ja niissä on käytettävä tilanvaihtoja muille kuin graafisille merkeille. Jos esimerkiksi haluat sisällyttää tekstiliteraalin rivinvaihto-, rivinsyöttö- tai sarkainmerkin, -, #(cr)#(lf)- ja #(tab) -tilanvaihtoja voidaan käyttää vastaavasti. Jos haluat upottaa escapesequence-alkumerkit #( tekstiliteraaliin, # itse on oltava pois:

#(#)(

Tilanvaihdot voivat sisältää myös lyhyitä (neljä heksanumeroa) tai pitkiä (kahdeksan heksanumeroa) Unicode-koodipisteen arvoja. Seuraavat kolme tilanvaihtoa vastaavat siis toisiaan:

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

Useita tilanvaihtokoodeja voidaan sisällyttää yksittäiseen tilanvaihtoon pilkuilla eroteltuina. seuraavat kaksi sarjaa vastaavat siis toisiaan:

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

Seuraavassa kuvataan vakiomerkkimekanismia M-asiakirjassa.

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
escape-escape:
      #

Literaalit

Literaali on arvon lähdekoodi-ilmaisu.

Kirjaimellinen:
      logical-literal
      number-literal
      text-literal
      null-literal
      sanatarkka–literaali

Tyhjäarvoiset literaalit

Tyhjäarvoisia literaalia käytetään kirjoittamaan null arvo. - null arvo edustaa puuttuvaa arvoa.

null-literal:
      null

Loogiset literaalit

Loogisen literaalin avulla kirjoitetaan arvot true ja false ja tuotetaan looginen arvo.

logical-literal:
      true
      false

Lukuliteraalit

Lukuliteraalia käytetään kirjoittamaan numeerinen arvo, ja se tuottaa lukuarvon.

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:
joku seuraavista
      + -
hexadecimal-number-literal:
      0xheksanumerot
      0Xheksanumerot
hex-digits:
      hex-digit hex-digitsopt
hex-digit:
joku seuraavista
      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

Luku voidaan määrittää heksadesimaalimuodossa ennen heksadesimaalimerkkiä merkkien 0xkanssa. Esimerkkejä:

0xff // 255

Huomaa, että jos desimaalierotin sisällytetään lukuliteraalissa, siinä on oltava vähintään yksi numero sen jälkeen. Esimerkiksi on lukuliteraali, 1.3 mutta ja 1.e31. eivät ole.

Tekstiliteraalit

Tekstiliteraalia käytetään kirjoittamaan sarja Unicode-merkkejä, ja se tuottaa tekstiarvon.

text-literal:
      "text-literal-charactersopt"
text-literal-characters:
      text-literal-character text-literal-charactersopt
text-literal-character:
      yksitekstinen-merkki
      character-escape-sequence
      double-quote-escape-sequence
single-text-character:

      Kaikki merkit paitsi " (U+0022) tai # (U+0023) minkä jälkeen ( (U+0028)
double-quote-escape-sequence:
      "" (U+0022, U+0022)

Jos haluat sisällyttää lainausmerkit tekstiarvoon, lainausmerkki toistetaan seuraavasti:

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

character-escape-sequence-tuotannossa voidaan kirjoittaa merkkejä tekstiarvoihin tarvitsematta koodata niitä asiakirjassa suoraan Unicode-merkeiksi. Esimerkiksi rivinvaihto ja rivin syöte voidaan kirjoittaa tekstiarvoon seuraavasti:

"Hello world#(cr,lf)"

Sanalliset literaaliliteraalit

Sanatarkkaa literaalia käytetään tallentamaan Unicode-merkkisarja, jonka käyttäjä on antanut koodina, mutta jota ei voida jäsentää oikein koodina. Suorituksen aikana se tuottaa virhearvon.

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

Tunnisteet

Tunniste on nimi, jolla viitataan arvoon. Tunnisteet voivat olla joko säännönmukaisiä tunnisteita tai lainausmerksyjä tunnisteita.

Tunnus:
      regular-identifier
      quoted-identifier
regular-identifier:
      available-identifier
      available-identifier dot-character regular-identifier
available-identifier:

      avainsana tai tunniste , joka ei ole avainsana
keyword-or-identifier:
      identifier-start-character identifier-part-charactersopt
identifier-start-character:
      letter-character
      alaviiva-merkki
identifier-part-characters:
      identifier-part-character identifier-part-charactersopt
identifier-part-character:
      letter-character
      decimal-digit-character
      alaviiva-merkki
      connecting-character
      yhdistä-merkki
      formatting-character
dot-character:

      . (U+002E)
underscore-character:
      _ (U+005F)
letter-character:
      Unicode-merkki luokissa Lu, Ll, Lt, Lm, Lo tai Nl
combining-character:
      Unicode-merkki luokissa Mn tai Mc
decimal-digit-character:
      Unicode-merkki luokassa Nd
connecting-character:
      Unicode-merkki luokassa Pc
formatting-character:
      Unicode-merkki luokassa Cf

quoted-identifier soveltuu käytettäväksi salliessa minkä tahansa nollan tai Unicode-merkkien sarjan käytön tunnisteena, mukaan lukien avainsanat, välilyönnit, kommentit, operaattorit ja erottijat.

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

Huomaa, että tilanvaihtoja ja lainausmerkkejä voi käyttää lainausmerkeissä lainausmerkeissä samalla tavalla kuin tekstiliteraalia.

Seuraavassa esimerkissä käytetään tunnisteen lainausmerkkejä, jotka sisältävät välilyöntimerkin:

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

Seuraavassa esimerkissä käytetään tunnisteen lainaustietoja, jotka sisällyttävät -operaattorin + tunnisteessa:

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

Yleistunnisteet

M-kirjaimessa on kaksi kohtaa, joissa tunnisteet eivät sisällä moniselitteisyyksiä, jotka sisältävät tyhjiä kohtia tai jotka ovat muuten avainsanoja tai lukuliteraaleja. Nämä kohdat ovat tietueen literaalin ja kentän käyttöoperaattorin ([ ]) tietuekenttien nimiä. Niissä M sallii nämä tunnisteet tarvitsematta käyttää lainausmerkeissä olevia tunnisteita.

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

Tunnisteita, joita käytetään nimi- ja käyttöoikeuskenttiin, kutsutaan yleistunnisteiksi ja määritellään seuraavasti:

generalized-identifier:
      generalized-identifier-part
      generalized-identifier
separated only by blanks (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

Avainsanat

Avainsana on varattuna oleva tunnisteen kaltainen merkkijono, eikä sitä voi käyttää tunnisteena, paitsi käytettäessä tunniste-lainaus-mekanismia tai kun yleistunniste sallitaan.

avainsana: joku seuraavista
       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

Operaattorit ja erottimen

On olemassa useita erilaisia operaattoreita ja erottimia. Operaattoreita käytetään lausekkeissa kuvaamaan toimintoja, joissa on vähintään yksi operandi. Esimerkiksi lauseke a + b käyttää +-operaattoria kahden operandin a ja blisäämiseen. Erottimet ovat ryhmittelyä ja erottamista varten.

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