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:
Asiakirja koodataan sen mukaan, mikä on sen merkkikoodausmalli Unicode-merkkien sarjaan.
Sanastollinen analyysi suoritetaan, jolloin Unicode-merkkien tietovirta muunnetaan tunnusten tietovirraksi. Tämän osion jäljellä olevat alaosat kattavat sanastollisen analyysin.
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:
if
jos-ehto then
true-expressionelse
false-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 muuttujan tai 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:
optional
opt field-name =
field-type
ilmaisee lyhyesti seuraavan:
field-specification:
field-name =
field-type
optional
field-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.
rahake:
tunniste
avainsana
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:
e
signopt decimal-digits
E
signopt decimal-digits
sign: joku seuraavista
+ -
hexadecimal-number-literal:
0x
heksanumerot
0X
heksanumerot
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 0x
kanssa. 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.e3
1.
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.
tunniste:
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 b
lisäämiseen. Erottimet ovat ryhmittelyä ja erottamista varten.
operator-or-punctuator: one of
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...