Lexikális struktúra
Dokumentumok
Az M-dokumentum Unicode-karakterek rendezett sorozata. Az M lehetővé teszi a Unicode-karakterek különböző osztályait az M-dokumentumok különböző részeiben. A Unicode-karakterosztályokkal kapcsolatos információkért lásd a Unicode Standard 3.0-s verzióját, a 4.5 szakaszt.
A dokumentumok vagy pontosan egy kifejezésből vagy szakaszokba rendezett definíciócsoportokból állnak. A szakaszokat a 10. fejezet ismerteti részletesen. Elméletileg a következő lépésekkel olvashat egy kifejezést egy dokumentumból:
A dokumentum karakterkódolási sémája szerint Unicode-karakterek sorozatába van dekódolva.
Lexikális elemzést végez, így a Unicode-karakterek streamje jogkivonatok adatfolyamává alakul. A szakasz további alszakaszai a lexikális elemzést fedik le.
A rendszer szintaktikai elemzést végez, így a jogkivonatok adatfolyamát egy kiértékelhető űrlapra fordítja. Ezt a folyamatot a következő szakaszok ismertetik.
Nyelvtani konvenciók
A lexikális és a szintaktikai nyelvtanok nyelvtani előadásokkal jelennek meg. Minden nyelvtani termelés meghatároz egy nem terminál szimbólumot, és a nemterminális szimbólum lehetséges kiterjesztését nem terminál- vagy terminálszimbólumok sorozataiba. A nyelvtani produkciókban a nem terminál+ szimbólumok dőlt, a terminálszimbólumok pedig rögzített szélességű betűtípussal jelennek meg.
A nyelvtani termelés első sora a definiált nem terminál szimbólum neve, amelyet kettőspont követ. Minden egymást követő behúzási vonal a nem termináljelek vagy terminálszimbólumok sorozataként megadott nemterminális szám lehetséges kiterjesztését tartalmazza. Például az éles környezet:
if-kifejezés:
if
if-condition then
true-expressionelse
hamis kifejezés
egy ha-kifejezést határoz meg, amely a jogkivonatbólif
, majd egy if-feltételből, majd a jogkivonatbólthen
, majd egy igaz kifejezésből, majd a jogkivonatbólelse
, majd egy hamis kifejezésből áll.
Ha egy nem terminál szimbólum több lehetséges kiterjesztése is lehetséges, az alternatívák külön sorokban jelennek meg. Például az éles környezet:
változólista:
változó
változólista változója ,
egy változólistát határoz meg, amely egy változóból áll, vagy egy változólistából és egy változóból áll. Más szóval a definíció rekurzív, és azt határozza meg, hogy egy változólista egy vagy több változóból áll, vesszővel elválasztva.
Az "opt" alsó indexelt utótag egy választható szimbólum jelzésére szolgál. A gyártás:
mezős specifikáció:
optional
választó mezőnév =
mezőtípus
rövidítés a következőhöz:
mezős specifikáció:
mezőnév =
mezőtípusa
optional
mezőnév =
mezőtípus
és meghatároz egy mezőspecifikációt, amely a terminálszimbólummal optional
kezdődik, majd egy mezőnévvel, a terminál szimbólummal =
és egy mezőtípussal.
Az alternatívák általában külön sorokban vannak felsorolva, bár olyan esetekben, amikor sok alternatíva létezik, az "egyik" kifejezés megelőzheti az egy sorban megadott bővítések listáját. Ez egyszerűen rövid, ha az egyes alternatívákat külön sorban sorolja fel. Például az éles környezet:
decimális számjegy: az egyik
0 1 2 3 4 5 6 7 8 9
rövidítés a következőhöz:
tizedesjegy:
0
1
2
3
4
5
6
7
8
9
Lexikális elemzés
A lexikális egység előállítása meghatározza az M-dokumentumok lexikális nyelvhelyességét. Minden érvényes M-dokumentum megfelel ennek a nyelvhelyességnek.
lexikális egység:
lexikális elemekopt
lexikális elemek:
lexikális elem
lexikális elem
lexikális elemek
lexikális elem:
Szóköz
jogkivonat megjegyzése
Lexikális szinten az M-dokumentum a térköz, a megjegyzés és a jogkivonat elemeiből álló adatfolyamból áll. Ezek mindegyikét a következő szakaszok ismertetik. A szintaktikai nyelvtanban csak a tokenelemek számítanak jelentősnek.
Térköz
A Whitespace egy M-dokumentumban lévő megjegyzések és jogkivonatok elkülönítésére szolgál. A whitespace tartalmazza a szóköz karaktert (amely a Unicode Zs osztály része), valamint a vízszintes és függőleges fület, az űrlapcsatornát és az újvonalas karaktersorozatokat. Az újvonalas karaktersorozatok közé tartoznak a kocsivissza, a vonalcsatorna, a kocsivissza, majd a sorbetöltés, a következő sor és a bekezdéselválasztó karakterek.
térköz:
Bármely karakter Unicode-osztály Zs-sel
Vízszintes tabulátor karakter (U+0009
)
Függőleges tabulátor karakter (U+000B
)
Űrlapcsatorna karaktere (U+000C
)
Kocsivissza karakter (U+000D
) és vonalcsatorna karakter (U+000A
)
new-line-character
new-line-character:
Kocsivissza karakter (U+000D
)
Vonalcsatorna karakter (U+000A
)
Következő sor karaktere (U+0085
)
Vonalelválasztó karakter (U+2028
)
Bekezdéselválasztó karakter (U+2029
)
A fájlvégpont-jelölőket jelölő forráskódszerkesztő eszközökkel való kompatibilitás, valamint a dokumentumok megfelelő végződésű sorok sorozataként való megtekintésének engedélyezése érdekében a következő átalakítások lesznek alkalmazva egy M-dokumentumra:
Ha a dokumentum utolsó karaktere Control-Z karakter (
U+001A
), akkor a program törli ezt a karaktert.Ha a dokumentum nem üres, és a dokumentum utolsó karaktere nem kocsivissza (), vonalcsatorna (
U+000D
U+000A
), vonalelválasztó (U+2028
) vagy bekezdéselválasztó (U+2029
).U+000D
Megjegyzések
A megjegyzések két formája támogatott: egysoros megjegyzések és tagolt megjegyzések. Az egysoros megjegyzések a karakterekkel //
kezdődnek, és a forrásvonal végéig terjednek. A tagolt megjegyzések a karakterekkel /*
kezdődnek, a végén pedig a karakterek.*/
Az elhatárolt megjegyzések több sorra is kiterjedhetnek.
megjegyzés:
egysoros megjegyzés
tagolt-megjegyzés
egysoros megjegyzés:
//
egysoros megjegyzéskarakterek
egysoros megjegyzéskarakterek:
egysoros megjegyzés-karakter egysoros-megjegyzéskarakterek
egysoros megjegyzés karakter:
Bármely Unicode-karakter, kivéve az új sorkarakte-karaktereket
tagolt-megjegyzés:
/*
elválasztójeles-comment-textopt asterisks /
tagolt-megjegyzés-szöveg:
elválasztójeles-comment-section elhatárolt-comment-textoptlimited-comment-section
:
/
a csillagoknem perjelet vagy csillagot választanak
Csillagocska:
*
csillag opt
nem perjel vagy csillag:
Bármely Unicode-karakter, kivéve *
vagy /
A megjegyzések nem ágyaznak be. A karaktersorozatok /*
, és */
nincs különleges jelentésük egy egysoros megjegyzésen belül, és a karaktersorozatok //
, és /*
nincs különleges jelentésük egy elhatárolt megjegyzésen belül.
A megjegyzések nem szövegkonstansokban vannak feldolgozva. A példa
/* Hello, world
*/
"Hello, world"
tagolt megjegyzést tartalmaz.
A példa
// Hello, world
//
"Hello, world" // This is an example of a text literal
több egysoros megjegyzést jelenít meg.
Tokenek
A jogkivonat egy azonosító, kulcsszó, literál, operátor vagy írásjel. A whitespace és a megjegyzések a jogkivonatok elkülönítésére szolgálnak, de nem számítanak jogkivonatnak.
token:
azonosító
kulcsszó
betű szerinti
operátor vagy írásjel
Feloldókarakter-sorozatok
Az M szöveges értékek tetszőleges Unicode-karaktereket tartalmazhatnak. A szövegkonstansok azonban csak grafikus karakterekre korlátozódnak, és a nem grafikus karakterekhez szükség van a feloldósorozatok használatára. Ha például kocsivissza, vonalas vagy tabulátor karaktert szeretne belefoglalni egy szövegkonstansba, a #(cr)
, #(lf)
és #(tab)
a feloldósorozatok használhatók. Az escapesequence kezdőkarakterek #(
szövegkonstansba való beágyazásához a #
következőt kell feloldani:
#(#)(
A feloldósorozatok rövid (négy hexás) vagy hosszú (nyolc hexás számjegy) Unicode kódpontértékeket is tartalmazhatnak. A következő három menekülési sorozat tehát egyenértékű:
#(000D) // short Unicode hexadecimal value
#(0000000D) // long Unicode hexadecimal value
#(cr) // compact escape shorthand for carriage return
Több menekülési kód is szerepelhet egyetlen menekülési sorozatban, vesszővel elválasztva; a következő két sorozat tehát egyenértékű:
#(cr,lf)
#(cr)#(lf)
Az alábbiakban bemutatjuk az M-dokumentumban való elszabadult karakterek szabványos mechanizmusát.
karakter-escape-sequence:
#(
escape-sequence-list )
escape-sequence-list:
egymeneküléses sorozat
egy-escape-sequence ,
escape-sequence-list
egymeneküléses sorozat:
long-unicode-escape-sequence
rövid unicode-escape-sequence
control-character-escape-sequence
menekülési-menekülési
long-unicode-escape-sequence:
hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit
rövid unicode-escape-sequence:
hex-digit hex-digit hex-digit hex-digit hex-digit
control-character-escape-sequence:
vezérlőelem-karakter
vezérlőkarakte:
cr
lf
tab
escape-escape:
#
Literálok
A literál egy érték forráskódjának ábrázolása.
betű szerinti:
logikai-literál
szám-literál
szövegkonstans
null-literál
verbatim-literál
Null literálok
A null literál az érték megírására null
szolgál. Az null
érték egy hiányzó értéket jelöl.
null-literál:
null
Logikai literálok
A logikai literál az értékek true
megírására és false
logikai érték létrehozásához használható.
logikai-literál:
true
false
Számkonstansok
A számkonstans numerikus érték írására és számérték létrehozásához használható.
szám-literál:
decimális-szám-literál
hexadecimális-szám-literál
decimális-szám-literál:
decimális számjegyek.
decimális számjegyek exponent-part opt
.
decimal-digits exponent-partopt
decimal-digits exponent-partopt
tizedesjegyek:
tizedesjegyes tizedesjegyek
decimális számjegy: az egyik
0 1 2 3 4 5 6 7 8 9
exponent-part:
e
a tizedesjegyek aláírása
E
a tizedesjegyek aláírása
jel: az egyik
+ -
hexadecimális-szám-literál:
0x
hexa számjegyek
0X
hexa számjegyek
hexa számjegyek:
hex-digit hex-digitsopt
hexa-digit: az egyik
0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
Egy szám hexadecimális formátumban adható meg, ha a hexa-számjegyeket a karakterekkel 0x
előzi meg. Példa:
0xff // 255
Vegye figyelembe, hogy ha egy tizedesvessző szerepel egy számkonstansban, akkor legalább egy számjegynek követnie kell azt. Például számkonstans, 1.3
de 1.
1.e3
nem.
Szövegkonstansok
A szövegkonstans Unicode-karakterek sorozatának megírására szolgál, és szöveges értéket hoz létre.
szövegkonstans:
"
szövegkonstans karakterekopt "
szövegkonstans karakterek:
szöveg-literál-karakter szöveg-literál-karakteropt
szövegkonstans karakter:
egy szöveges karakter
karakter-escape-sequence
dupla idézőjel-escape-sequence
egy szöveges karakter:
Bármely karakter, kivéve "
(U+0022
) vagy #
(U+0023
) után (
(U+0028
)
dupla idézőjel-escape-sorozat:
""
(U+0022
, U+0022
)
Ha idézőjeleket szeretne belefoglalni egy szöveges értékbe, az idézőjel az alábbiak szerint ismétlődik:
"The ""quoted"" text" // The "quoted" text
A karakter-feloldó-sorozatgyártás használható karakterek szöveges értékekben való írására anélkül, hogy közvetlenül Unicode-karakterekként kellene őket kódolni a dokumentumban. Például egy kocsivissza- és vonalcsatorna szöveges értékben írható a következő módon:
"Hello world#(cr,lf)"
Szó szerinti literálok
A szó szerinti literál olyan Unicode-karakterek sorozatának tárolására szolgál, amelyeket a felhasználó kódként adott meg, de kódként nem elemezhető helyesen. Futásidőben hibaértéket eredményez.
verbatim-literál:
#!"
szövegkonstans karakterekopt "
Identifiers
Az azonosító egy értékre hivatkozó név. Az azonosítók lehetnek rendszeres azonosítók vagy idézett azonosítók.
azonosító:
normál azonosító
idézett azonosító
normál azonosító:
available-identifier
available-identifier dot-character regular-identifier
available-identifier:
Olyan kulcsszó vagy azonosító , amely nem kulcsszó
kulcsszó vagy azonosító:
identifier-start-character identifier-part-charactersopt
identifier-start-character:
betűjel
aláhúzásjel
azonosító-részkarakterek:
identifier-part-character identifier-part-charactersopt
azonosító-rész karakter:
betűjel
decimális-számjegy karakter
aláhúzásjel
connecting-character
egyesítési karakter
formázási karakter
pont-karakter:
.
(U+002E
)
aláhúzásjel:
_
(U+005F
)
betűjel:
A Lu, Ll, Lt, Lm, Lo vagy Nl osztály Unicode-karaktere
egyesítési karakter:
Az Mn vagy Mc osztály Unicode-karaktere
decimális-számjegy karakter:
Az Nd osztály Unicode-karaktere
connecting-character:
A Pc osztály Unicode karaktere
formázási karakter:
A Cf osztály Unicode karaktere
Az idézett azonosítók segítségével bármely nulla vagy több Unicode-karakterből álló sorozat használható azonosítóként, beleértve a kulcsszavakat, a szóközöket, a megjegyzéseket, az operátorokat és az írásjeleket.
idézett azonosító:
#"
szövegkonstans karakterekopt "
Vegye figyelembe, hogy az idézőjelek feloldására szolgáló feloldósorozatok és dupla idézőjelek idézőjeles azonosítóban is használhatók, ugyanúgy, mint a szövegkonstansban.
Az alábbi példa egy szóköz karaktert tartalmazó nevek azonosító idézőjelét használja:
[
#"1998 Sales" = 1000,
#"1999 Sales" = 1100,
#"Total Sales" = #"1998 Sales" + #"1999 Sales"
]
Az alábbi példa az azonosító idézésével foglalja bele az +
operátort egy azonosítóba:
[
#"A + B" = A + B,
A = 1,
B = 2
]
Általános azonosítók
Az M-ben két helyen nem vezetnek be kétértelműséget üres vagy egyéb kulcsszavakat vagy számkonstansokat tartalmazó azonosítók. Ezek a helyek a rekordkonstans rekordmezőinek nevei, és egy mezőhozzáférés-operátorban ([ ]
) Ott az M lehetővé teszi az ilyen azonosítókat idézett azonosítók használata nélkül.
[
Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]
]
A mezők elnevezéséhez és eléréséhez használt azonosítókat általános azonosítóknak nevezzük, és az alábbiak szerint vannak definiálva:
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:
kulcsszó vagy azonosító
kulcsszó-vagy azonosító pont-karakter kulcsszó vagy azonosító
Kulcsszavak
A kulcsszó egy fenntartott karaktersorozat azonosítóhoz hasonló sorozata, amely nem használható azonosítóként, kivéve az azonosító-idéző mechanizmus használatakor vagy az általános azonosító engedélyezése esetén.
kulcsszó: az egyik
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átorok és írásjelek
Többféle operátor és írásjel is létezik. Az operátorok a kifejezésekben egy vagy több operandust érintő műveletek leírására szolgálnak. A kifejezés a + b
például az +
operátorral adja hozzá a két operandust a
és b
a . Az írásjelek csoportosításra és elkülönítésre szolgálnak.
operátor vagy írásjel: az egyik
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...