Del via


Leksikalsk struktur

Dokumenter

Et M-dokument er en ordnet sekvens med Unicode-tegn. M tillater ulike klasser av Unicode-tegn i ulike deler av et M-dokument. Hvis du vil ha informasjon om Unicode-tegnklasser, kan du se Unicode Standard, versjon 3.0, del 4.5.

Et dokument består av nøyaktig ett uttrykk eller grupper med definisjoner organisert i inndelinger. Inndelinger er beskrevet i detalj i kapittel 10. Begrepsmessig sett brukes følgende trinn til å lese et uttrykk fra et dokument:

  1. Dokumentet dekodes i henhold til tegnkodingsoppsettet i en sekvens med Unicode-tegn.

  2. Leksikalsk analyse utføres, og oversetter dermed strømmen av Unicode-tegn til en strøm av tokener. De gjenværende underdelene i denne delen dekker leksikalsk analyse.

  3. Syntaktisk analyse utføres, og oversetter dermed strømmen av tokener til et skjema som kan evalueres. Denne prosessen dekkes i etterfølgende inndelinger.

Grammatikk-konvensjoner

Leksikalske og syntaktiske grammatikker presenteres ved hjelp av grammatikkproduksjoner. Hver grammatikkproduksjon definerer et ikke-terminalt symbol og mulige utvidelser av det ikke-terminale symbolet i sekvenser av ikke-terminale eller terminalsymboler. I grammatikkproduksjoner vises ikke-terminal+ symboler i kursiv type, og terminalsymboler vises i en skrift med fast bredde.

Den første linjen i en grammatikk-produksjon er navnet på det ikke-terminal symbolet som defineres, etterfulgt av et kolon. Hver etterfølgende innrykkede linje inneholder en mulig utvidelse av ikke-terminalen gitt som en sekvens av ikke-terminal- eller terminalsymboler. For eksempel produksjonen:

hvis-uttrykk:
      ifhvis-betingelse then true-expressionelseusann-uttrykk

definerer et hvis-uttrykk som skal bestå av tokenet if, etterfulgt av en hvis-betingelse, etterfulgt av tokenet then, etterfulgt av et sann uttrykk, etterfulgt av tokenet else, etterfulgt av et usant uttrykk.

Når det er mer enn én mulig utvidelse av et ikke-terminal symbol, vises alternativene på separate linjer. For eksempel produksjonen:

variabel-liste:
      Variabel
      variabel-listevariabel
,

definerer en variabelliste som enten består av en variabel eller består av en variabelliste etterfulgt av en variabel. Definisjonen er med andre ord rekursiv og angir at en variabelliste består av én eller flere variabler, atskilt med komma.

Et senket suffiks «opt» brukes til å angi et valgfritt symbol. Produksjonen:

feltspesifikasjon:
      optionalvelg felttype for feltnavn =

er forkortelse for:

feltspesifikasjon:
      feltnavnfelttype
=
      optionalfeltnavn = felttype

og definerer en feltspesifikasjon som eventuelt begynner med terminalsymbolet optional etterfulgt av et feltnavn, terminalsymbolet =og en felttype.

Alternativer er vanligvis oppført på separate linjer, men i tilfeller der det finnes mange alternativer, kan uttrykket "en av" komme foran en liste over utvidelser gitt på én enkelt linje. Dette er rett og slett en forkortelse for å liste opp hvert av alternativene på en egen linje. For eksempel produksjonen:

desimaltall: én av
      0 1 2 3 4 5 6 7 8 9

er forkortelse for:

desimaltall:
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9

Leksikalsk analyse

Leksikalsk enhetsproduksjon definerer leksikalsk grammatikk for et M-dokument. Alle gyldige M-dokumenter samsvarer med denne grammatikken.

leksikalsk enhet:
      leksikalske elementervelger
leksikalske elementer:
      leksikalsk element
      leksikalsk element
      leksikalske elementer
leksikalsk element:
      mellomrom
      tokenkommentar

På leksikalsk nivå består et M-dokument av en strøm av mellomrom, kommentar og tokenelementer . Hver av disse produksjonene dekkes i avsnittene nedenfor. Bare tokenelementer er signifikante i syntaktisk grammatikk.

Mellomrom

Mellomrom brukes til å skille kommentarer og tokener i et M-dokument. Mellomrom inkluderer mellomromstegnet (som er en del av Unicode-klasse Zs), i tillegg til vannrett og loddrett fane, skjemafeed og nylinjede tegnsekvenser. Nye tegnsekvenser inkluderer linjeretur, linjeskift, linjeretur etterfulgt av linjefeed, neste linje og avsnittsskilletegn.

mellomrom:
      Alle tegn med Unicode-klasse Zs
      Vannrett tabulatortegn (U+0009)
      Loddrett tabulatortegn (U+000B)
      Skjemafeedtegn (U+000C)
      Returtegn for vogn (U+000D) etterfulgt av linjefeedtegn (U+000A)
      nytt linjetegn
nytt linjetegn:
      Returtegn for vogn (U+000D)
      Linjefeedtegn (U+000A)
      Neste linjetegn (U+0085)
      Linjeskilletegn (U+2028)
      Avsnittsskilletegn (U+2029)

Hvis du vil ha kompatibilitet med redigeringsverktøy for kildekoder som legger til sluttfilindikatorer, og for å aktivere et dokument som skal vises som en sekvens med riktig avsluttede linjer, brukes følgende transformasjoner i rekkefølge i et M-dokument:

  • Hvis det siste tegnet i dokumentet er et Control-Z-tegn (U+001A), slettes dette tegnet.

  • Et returtegn (U+000D) legges til på slutten av dokumentet hvis dokumentet ikke er tomt, og hvis det siste tegnet i dokumentet ikke er en retur (U+000D), en linjefeed (U+000A), et linjeskilletegn (U+2028) eller et avsnittsskilletegn (U+2029).

Kommentarer

To former for kommentarer støttes: kommentarer med én linje og kommentarer med skilletegn. Kommentarer med én linje starter med tegnene // og strekker seg til slutten av kildelinjen. Kommentarer med skilletegn starter med tegnene /* og slutter med tegnene */.

Kommentarer med skilletegn kan gå over flere linjer.

kommentar:
      kommentar med én linje
      delimited-comment
kommentar med én linje:

      //enkeltlinje-kommentar-tegnvelger
kommentartegn med én linje:
      enkeltlinje-kommentar-tegn enkeltlinje-kommentar-tegnvelger
kommentartegn med én linje:

      Alle Unicode-tegn unntatt et nytt linjetegn
kommentar med skilletegn:

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

      /
      stjernervelger ikke-skråstrek-eller-stjerne
Stjerner:

      *stjerner velger
not-slash-or-asterisk:

      Alle Unicode-tegn unntatt * eller /

Kommentarer nestes ikke. Tegnsekvensene /* og */ har ingen spesiell betydning i en kommentar på én linje, og tegnsekvensene // og /* har ingen spesiell betydning i en skilletegnkommentar.

Kommentarer behandles ikke i tekstlitteraler. Eksemplet

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

inneholder en kommentar med skilletegn.

Eksemplet

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

viser flere kommentarer med én linje.

Tokener

Et token er en identifikator, nøkkelord, litteral, operator eller tegnsetting. Mellomrom og kommentarer brukes til å skille tokener, men anses ikke som tokener.

merke:
      identifikator
      nøkkelord
      bokstavelig
      operator-eller-tegnsetting

Tegnrømningssekvenser

M-tekstverdier kan inneholde tilfeldige Unicode-tegn. Tekstlitteraler er imidlertid begrenset til grafikktegn og krever bruk av escape-sekvenser for tegn som ikke er grafiske. Hvis du for eksempel vil inkludere et vognretur-, linjefeed- eller tabulatortegn i en tekstlitteral, #(cr)kan henholdsvis sekvensene , , #(lf)og escape- og #(tab) escape-sekvensene brukes. Hvis du vil bygge inn escapesequence-starttegnene #( i en tekstlitteral, # må selve unnslippes:

#(#)(

Escape-sekvenser kan også inneholde korte (fire heksadesimale sifre) eller lange (åtte heksadesimale sifre) Unicode-kodepunktverdier. Følgende tre escape-sekvenser er derfor like:

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

Flere escape-koder kan inkluderes i én enkelt escape-sekvens, atskilt med komma. følgende to sekvenser tilsvarer følgende:

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

Følgende beskriver standardmekanismen for tegn som rømmer i et M-dokument.

tegn-escape-sekvens:
      #( escape-sequence-list )
escape-sequence-list:
      enkelt-escape-sekvens
      enkelt-escape-sekvens
, escape-sequence-liste
enkelt-escape-sekvens:
      long-unicode-escape-sequence
      kort-unicode-escape-sekvens
      kontroll-tegn-escape-sekvens
      escape-escape
long-unicode-escape-sequence:
      heksadesimal heksadesimal heksadesimal heksadesimal heksadesimal heksadesimal heksadesimal heksadesimal siffer
kort-unicode-escape-sekvens:
      heksadesimal heksadesimal heksadesimal heksadesimal heksadesimal
kontroll-tegn-escape-sekvens:
      kontroll-tegn
kontroll-tegn:

      cr
      lf
      tab
escape-escape:
      #

Litteraler

En litteral er en kildekode-representasjon av en verdi.

bokstavelig:
      logisk-litteral
      talllitteral
      tekstlitteral
      null-litteral
      ordrett-litteral

Nulllitteraler

Nulllitteralen null brukes til å skrive verdien. Verdien null representerer en fraværende verdi.

null-litteral:
      null

Logiske litteraler

En logisk litteral brukes til å skrive verdiene true og false produsere en logisk verdi.

logisk-litteral:
      true
      false

Nummer-litteraler

En talllitteral brukes til å skrive en numerisk verdi og produserer en tallverdi.

talllitteral:
      desimaltall-litteral
      heksadesimaltall-litteral
desimaltall-litteral:
      desimalsifre
.desimalsifre eksponentdel
      . eksponentdelfor desimalsifre
      eksponentdelfor desimalsifre
desimaltall:
      desimalsifrede desimalervelger
desimaltall:
én av
      0 1 2 3 4 5 6 7 8 9
eksponentdel:
      esignopt decimal-digits
      Esignopt decimal-digits
sign:
én av
      + -
heksadesimaltall-litteral:
      0xheksadesimale sifre
      0Xheksadesimale sifre
heksadesimale sifre:
      heksadesimale heksadesimale sifrevelger
heksadesimal siffer:
én av
      0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

Et tall kan angis i heksadesimalformat ved å sette de heksadesimale sifrene foran tegnene0x. Eksempel:

0xff // 255

Vær oppmerksom på at hvis et desimaltegn er inkludert i en talllitteral, må det ha minst ett siffer etter det. Er for eksempel en talllitteral, 1.3 men 1. 1.e3 ikke.

Tekst-litteraler

En tekstlitteral brukes til å skrive en sekvens med Unicode-tegn og produsere en tekstverdi.

tekstlitteral:
      " tekst-litteral-tegnvelger "
tekst-litterale tegn:
      tekst-litteral-tegn tekst-litteral-tegnvelger
tekst-litteral-tegn:
      enkelttekst-tegn
      tegn-escape-sekvens
      dobbelt-sitat-escape-sekvens
enkeltteksttegn:

      Alle tegn unntatt " (U+0022) eller # (U+0023) etterfulgt av ( (U+0028)
dobbelt-sitat-escape-sekvens:
      "" (U+0022, U+0022)

Hvis du vil inkludere anførselstegn i en tekstverdi, gjentas anførselstegnet, som følger:

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

Produksjonen av tegnrømningssekvensen kan brukes til å skrive tegn i tekstverdier uten å måtte kode dem direkte som Unicode-tegn i dokumentet. En retur og linjefeed kan for eksempel skrives i en tekstverdi som:

"Hello world#(cr,lf)"

Ordrette litteraler

En ordrett litteral brukes til å lagre en sekvens med Unicode-tegn som ble angitt av en bruker som kode, men som ikke kan analyseres som kode på riktig måte. Ved kjøring produserer den en feilverdi.

ordrett-litteral:
      #!"tekst-litteral-tegnvelger "

Identifiers

En identifikator er et navn som brukes til å referere til en verdi. Identifikatorer kan enten være vanlige identifikatorer eller siterte identifikatorer.

Identifikator:
      vanlig identifikator
      quoted-identifier
vanlig identifikator:
      tilgjengelig identifikator
      vanlig identifikator med tilgjengelige identifikatorer
tilgjengelig identifikator:

      Et nøkkelord eller en identifikator som ikke er et nøkkelord
nøkkelord eller identifikator:
      identifikator-start-tegn-identifikator-part-tegnvelger
identifikator-start-tegn:
      letter-tegn
      understrekingstegn
identifikatordeltegn:
      Identifier-part-character identifier-part-charactersopt
identifikatordeltegn:
      letter-tegn
      desimal-siffer-tegn
      understrekingstegn
      koblingstegn
      kombinere tegn
      formateringstegn
prikketegn:

      . (U+002E)
understrekingstegn:
      _ (U+005F)
letter-tegn:
      Et Unicode-tegn i klassene Lu, Ll, Lt, Lm, Lo eller Nl
kombinerer tegn:
      Et Unicode-tegn i klassene Mn eller Mc
desimalsifret tegn:
      Et Unicode-tegn i klassen Nd
koblingstegn:
      Et Unicode-tegn på klasse-PC-en
formateringstegn:
      Et Unicode-tegn i klassen Cf

En sitert identifikator kan brukes til å tillate at en sekvens med null eller flere Unicode-tegn brukes som identifikator, inkludert nøkkelord, mellomrom, kommentarer, operatorer og tegnsettingstegn.

quoted-identifier:
      #" tekst-litteral-tegnvelger "

Vær oppmerksom på at escape sekvenser og doble anførselstegn for å unnslippe anførselstegn kan brukes i en sitert identifikator, akkurat som i en tekst-litteral.

Følgende eksempel bruker identifikatorsitering for navn som inneholder et mellomromstegn:

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

Følgende eksempel bruker identifikatorsitering til å inkludere operatoren + i en identifikator:

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

Generaliserte identifikatorer

Det finnes to steder i M hvor ingen tvetydigheter innføres av identifikatorer som inneholder tomme verdier, eller som ellers er nøkkelord eller talllitteraler. Disse stedene er navnene på postfelt i en postlitteral, og i en felttilgangsoperator ([ ]) Der tillater M slike identifikatorer uten å måtte bruke siterte identifikatorer.

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

Identifikatorene som brukes til å navngi og få tilgang til felt, kalles generaliserte identifikatorer og defineres som følgende:

generalisert identifikator:
      generalisert identifikatordel
      generalisert identifikator
atskilt bare med tomme verdier (U+0020)
generalisert identifikatordel
generalisert identifikatordel:
      generalisert-identifikator-segment
      desimal-siffer-tegn generalisert-identifikator-segment
generalisert-identifikator-segment:
      nøkkelord eller identifikator
      nøkkelord-eller-identifikator-nøkkelord-eller-identifikator for prikk-tegn

Nøkkelord

Et nøkkelord er en identifikatorlignende sekvens med tegn som er reservert, og kan ikke brukes som identifikator, bortsett fra når du bruker identifikatorsiteringsmekanismen eller hvor en generalisert identifikator er tillatt.

nøkkelord: ett av
       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

Operatorer og tegnsettingstegn

Det finnes flere typer operatorer og tegnsettingstegn. Operatorer brukes i uttrykk for å beskrive operasjoner som involverer én eller flere operander. Uttrykket a + b bruker for eksempel +-operatoren til å legge til de to operandene a og b. Tegnsettinger er for gruppering og skilletegn.

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