Megosztás a következőn keresztül:


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:

  1. A dokumentum karakterkódolási sémája szerint Unicode-karakterek sorozatába van dekódolva.

  2. 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.

  3. 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:
      ifif-condition then true-expressionelsehamis 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ó:
      optionalvá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
      optionalmező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+000DU+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
      Ea tizedesjegyek aláírása
jel:
az egyik
      + -
hexadecimális-szám-literál:
      0xhexa számjegyek
      0Xhexa 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 0xelő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 ba . Az írásjelek csoportosításra és elkülönítésre szolgálnak.

operátor vagy írásjel: az egyik
      , ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...