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:
Dokument sa dekóduje podľa jeho schémy kódovania znakov do postupnosti znakov Unicode.
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.
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:
if
if-condition then
true-expressionelse
false-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 premennej alebo 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:
optional
opt field-name =
field-type
je skratka pre:
field-specification:
field-name =
field-type
optional
field-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
).
Komentáre
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:
e
signopt decimal-digits
E
signopt decimal-digits
sign: one of
+ -
hexadecimal-number-literal:
0x
hex-digits (hex-digits)
0X
hex-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:
.
Nie je to veľmi miléU+002E
.
znak podčiarknutia:
_
Nie je to veľmi milé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
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...