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:
Dokumentet dekodes i henhold til tegnkodingsoppsettet i en sekvens med Unicode-tegn.
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.
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:
if
hvis-betingelse then
true-expressionelse
usann-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:
optional
velg felttype for feltnavn =
er forkortelse for:
feltspesifikasjon:
feltnavnfelttype =
optional
feltnavn =
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:
e
signopt decimal-digits
E
signopt decimal-digits
sign: én av
+ -
heksadesimaltall-litteral:
0x
heksadesimale sifre
0X
heksadesimale 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
, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? ?? => .. ...