Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Note
Interessegrupper for fellesskapet har nå flyttet fra Yammer til Microsoft Viva Engage. Hvis du vil bli med i et Viva Engage-fellesskap og delta i de siste diskusjonene, fyller du ut skjemaet Be om tilgang til Finance and Operations Viva Engage Community og velger fellesskapet du vil bli med i.
Denne artikkelen inneholder syntaksreferansen for X++.
X++ Nøkkelord
X++-nøkkelordene som vises i tabellen nedenfor, er reservert. Disse nøkkelordene kan ikke brukes til andre formål.
| Reservert ord | beskrivelse | Relatert informasjon |
|---|---|---|
| ! | Ikke. | Relasjonsoperatorer |
| != | Ulikhetsoperator (ikke lik). | Relasjonsoperatorer |
| # | Prefiks på makronavn. | Slik bruker du #define og #if til å teste en makro |
| & | Binær OG. | Aritmetiske operatorer |
| && | Logisk OG. | Relasjonsoperatorer |
| ( | Funksjonsanropsoperator, som angir begynnelsen av funksjonskallet. | |
| ) | Funksjonsanropsoperator, som angir slutten på funksjonskallet. | |
| * | Multiplisere. Stjernen (*) brukes også i X++ SQL. Én bruk er å betegne alle felt fra tabellene i en select setning. En annen bruk er som et jokertegn med operatoren like , for å betegne 0 til mange tegn av noe slag. Operatoren like bruker også tegnet ? . |
Aritmetiske operatorer |
| ^ | Binær XOR. | Aritmetiske operatorer |
| | | Binær ELLER. | Aritmetiske operatorer |
| || | Logisk ELLER. | Relasjonsoperatorer |
| ~ | Ikke. | Aritmetiske operatorer |
| + | Pluss. | Aritmetiske operatorer |
| ++ | Økning. | Tildelingsoperatorer |
| += | Additiv oppgave. | Tildelingsoperatorer |
| , | Kommaoperator. Uttrykk atskilt med komma evalueres sekvensielt fra venstre mot høyre. | |
| - | Minus. | Aritmetiske operatorer |
| -- | Decrement operator. | Tildelingsoperatorer |
| -= | Subtractive tildeling. | Tildelingsoperatorer |
| . | Tilgangsoperator for klassemedlemmer får for eksempel formRun.run tilgang til run metoden for et objekt av klassetypen FormRun. |
|
| / | Dele. | Aritmetiske operatorer |
| \ | Escape i strenger. Fjerner ekstra anførselstegn og bestemte bokstaver, for eksempel \t for fanen. | |
| @ | Rømning av nøkkelord. Kan for eksempel ikke kompilere uten var @str = 1@abstract; tegnet som fører til at strenger som følger den, @ anses som en identifikator. Det påvirker også litterale strenger, ved å oppheve effekten av \ escape-tegnet, og ved å aktivere strengen for å strekke seg over mer enn én linje i kildekoden. Den nye linjen representeres av ett tegn med heksadesimal 0x0A, som vanligvis kalles en linjefeed. Ingen vognreturtegn for heksadesimal 0x0D er inkludert, som i 0x0D0A. | |
| : | Kolontegnet (:) brukes til å skille mellom store og små bokstaver i setningen switch . |
|
| :: | Brukes til å kalle statiske metoder (klasse) : ClassName::methodName() og til å angi opplistingslitteraler, for eksempel NoYes::Ja. | |
| ; | Avslutter setninger. Brukes i for løkker eller som skilletegn for initialiserings-, oppdaterings- og verdikontrolldeler. |
|
| < | Mindre enn. | Relasjonsoperatorer |
| << | Venstre skift. | Aritmetiske operatorer |
| <= | Mindre enn eller lik. | Aritmetiske operatorer |
| = | Tildelingsoperator. Argumentet til venstre for «=» er satt til verdien for argumentet til høyre. | Tildelingsoperatorer |
| == | Returnerer sann hvis uttrykkene er like. | Relasjonsoperatorer |
| > | Større enn. | Relasjonsoperatorer |
| >= | Større enn eller lik. | Relasjonsoperatorer |
| >> | Bitvis høyre skift. Denne operatoren flytter biter i venstre side av beløpet på høyre side. Hvert skift deler effektivt tallet med 2^n, der n er antall forskjøvet posisjoner. | Aritmetiske operatorer |
| ?: | Ternary operatør. Spørsmålstegnet (?) brukes også av operatoren like til å betegne nøyaktig ett tegn av noe slag. Operatoren like bruker også tegnet. |
Ternary Operator (?) |
| [ | Matrisedeklarator, åpne. Må brukes med ]. | |
| ] | Matrisedeklarator, lukk. Må brukes med [. | |
| { | Starter en sammensatt setning som igjen kan inneholde null eller flere setninger. Den sammensatte setningen slutter med den nærmeste samsvarende "}". | |
| } | Angir slutten på den sammensatte setningen som er beskrevet ovenfor. En {må vises før den første av disse setningene. | |
| abstrakt | Klasse- og metodeendringsprogram. En abstrakt klasse kan ikke konstrueres med det nye nøkkelordet - Bare klassene avledet fra det kan. En abstrakt metode kan ikke kalles, bare metoder som overstyrer den. En tabell kan endres som abstrakt ved å sette den abstrakte egenskapen til Ja i AOT eller ved hjelp DictTable av klassen.
Abstract-egenskapen er som standard nei, og den kan ikke angis med mindre tabellen utvides av en annen tabell. Hver rad i en abstrakt tabell må ha en avhengig rad i en avledet tabell. Dette betyr at hver rad i en abstrakt tabell har en verdi som er større enn null i egenskapsfeltet InstanceRelationType . Det er ingen andre effekter ved å merke en tabell som abstrakt. Uformelt bruker programmerere ofte begrepet betong for å beskrive en klasse som ikke er abstrakt. |
Oversikt over tabellarv for metodeendring |
| anytype | En type som kan inneholde verdier av alle typer. | Anytype |
| som | Nødvendig når du tilordner en basisklassevariabel til en avledet klassevariabel. For eksempel, gitt en Derived klasse som utvider en Base klasse, unngår setningen myDerived = myBase as Derived; en kompilatorfeil ved å bruke som nøkkelord. Dette nøkkelordet gjelder også når du tilordner en basistabellvariabel til en avledet tabellvariabel. Hvis verdien (myBase) ikke er av den angitte typen (avledet), returnerer uttrykket null. |
Uttrykksoperatorer: Is og As for Inheritance |
| Asc | Et alternativ på orderby eller - groupby setningen i en select setning. Sorteringen er stigende. |
Velg setningssyntaks |
| på | Angir plasseringen av et utskriftsvindu som en del av en print setning. Utskriftssetningen skal ikke brukes. |
Skriv ut setninger |
| Avg | Returnerer gjennomsnittet av feltene fra radene som er angitt av setningsdelen group by i et select uttrykk. |
Velg setningssyntaks |
| pause | Umiddelbar utgang fra en gjentakelseskodeblokk. | Bryt setninger |
| Stoppunkt | Representerer et bruddpunkt som er angitt for feilsøkingsformål. Hvis du vil angi et bruddpunkt i koden, skriver du: breakpoint; |
|
| ved | Del av en reservert term, for eksempel grupper etter og bestill etter. | |
| byref | Angir at parameteren som sendes til den kalt metoden, sendes med referanse (adresse), i stedet for etter verdi. Byref brukes i X++ når du kaller en .NET-metode som tar en parameter etter referanse (for eksempel med C#-nøkkelordene ut eller ref). | Slik bruker du byref-nøkkelordet for CLR Interop. |
| sak | Valg i en switch setning. |
Bytt setninger |
| fange | Brukes i unntaksbehandling. | Unntaksbehandling med forsøk og fange opp nøkkelord |
| changeCompany | Endrer databaseinnstillinger til et annet firma. | Endre utformingsmønster for firmaet |
| klasse | Erklærer en klasse. | Klasser i X++ |
| klient | Metodeendring. Disse modifikatorene brukes ikke lenger. Alle metoder utføres på servernivået. | Method Modifiers |
| beholder | Angir container typen. Beholdere inneholder en sekvens av atomverdier og andre beholdere. |
Beholdere |
| fortsette | Tvinger neste gjentakelse av en løkke. | Fortsett setninger |
| greve | Returnerer antall poster fra radene som er angitt av group by setningsdelen i en select setning. |
Velg setningssyntaks |
| crossCompany | Fører til at en select setning returnerer data for alle firmaer som brukeren har tillatelse til å lese fra. |
Grunnleggende om X++-kode på tvers av firma |
| daddel | Angir en variabel av typen date. |
Datoer |
| standard | Standardtilfelle i switch setninger. Kodeblokken i standarddelen utføres hvis bryterverdien ikke samsvarer med noen av setningene case i setningen switch . |
Bytt setninger |
| delegere | Et klassemedlem som kan lagre flere referanser til metoder i andre klasser, og til å kalle opp alle disse metodene når de blir bedt om det. En representant kan lagre referanser til ulike typer metoder, inkludert følgende:
|
Hendelsesterminologi og nøkkelord X++, C# Sammenligning: Hendelse |
| delete_from | Lar deg slette poster fra databasen. | delete_from |
| Desc | Et alternativ på order by eller - group by setningen i en select setning. Sorteringen er synkende. |
Velg setningssyntaks |
| vise | Metodeendring. En visnings<-/visningsmetode> brukes til å vise beregnede verdier i en skjemakontroll. I motsetning til vanlige felt lagres ikke disse verdiene i databasen, men beregnes dynamisk. |
Method Modifiers |
| div | Heltallsdivisjon. | Aritmetiske operatorer |
| gjøre | Begynnelsen av en do...while løkke. |
Gjøre... mens løkker |
| redigere | Metodeendring. En edit metode i X++ gjør det mulig for brukere å endre verdier i en skjemakontroll mens de utfører egendefinert logikk. I motsetning til display metoder, som bare viser beregnede verdier, aktiverer redigeringsmetoder både visning og redigering.
|
Method Modifiers |
| ellers | Betinget kjøring (if...else). Delen else av setningen if utføres hvis uttrykket i if-setningen evalueres til false |
hvis og hvis ... andre setninger |
| eventHandler | Må brukes hver gang du enten legger til eller sletter en metodereferanse fra en representant ved hjelp av eller += -operatoren-=. Eksempel: myDelegate += eventHandler(OtherClass::myStaticMethod); | Hendelsesterminologi og nøkkelord X++, C# Sammenligning: Hendelse |
| Finnes | Brukes med join setningsdeler i select setninger. |
Velg setningssyntaks |
| Utvider | En klasse- eller grensesnittdeklarasjonssetning. Hvis klassen ikke eksplisitt utvider en annen klasse, anses klassen å utvide Object klassen (som om du hadde skrevet «utvider objektet»). |
Opprette en underklasse |
| falsk | Boolsk litteral. | Booleans |
| finale | Klasse- og metodeendringsprogram. Angir at denne metoden ikke kan overstyres. | Method Modifiers |
| firstFast | Brukes i select setninger til å øke hastigheten på hentingen for den første raden. |
Velg setningssyntaks |
| firstOnly | Brukes i select setninger til å hente bare den første posten. Nøkkelordet firstOnly garanterer ikke at maksimalt én post hentes av en X++ SQL-setning select . Hvis AOS kan bruke hurtigbufferen EntireTable til å oppfylle datakravene til select setningen, firstOnly ignoreres nøkkelordet. |
Velg uttrykkssyntakssettbasert hurtigbufring |
| firstOnly10 | Samme som for det første, bortsett fra returnerer 10 rader i stedet for én. | |
| firstOnly100 | Samme som for det første, bortsett fra returnerer 100 rader i stedet for én. | |
| firstOnly1000 | Samme som for det første, bortsett fra returnerer 1000 rader i stedet for én. | |
| spyle | Fjerner hele tabellhurtigbufferen. Dette kan være nyttig når du vil sikre at eventuelle endringer i tabellen umiddelbart gjenspeiles i etterfølgende operasjoner. | Settbasert hurtigbufring |
| for | For løkke gjentakelse. | For løkker |
| forceLiterals | Brukes i select setninger til å vise faktiske verdier som brukes i where setninger til Microsoft SQL Server-databasen på tidspunktet for optimalisering. |
Velg setningssyntaks |
| forceNestedLoop | Tvinger SQL Server-databasen til å bruke en nestet løkkealgoritme til å behandle en bestemt SQL-setning som inneholder en join. |
Velg setningssyntaks |
| forcePlaceholders | Brukes i select setninger til å be kjernen om ikke å vise de faktiske verdiene som brukes i where setninger til Microsoft SQL Server-databasen på optimaliseringstidspunktet. |
Velg setningssyntaks |
| forceSelectOrder | Tvinger SQL Server-databasen til å få tilgang til tabellene i en sammenføyning i den angitte rekkefølgen. | Velg setningssyntaks |
| forUpdate | Velger poster utelukkende for oppdatering. Operasjonen som skal utføres på postene som hentes, er en oppdatering. Postene kan være låst for andre brukere, avhengig av den underliggende databasen. | Velg setningssyntaks |
| fra | En del av en select setning. Setningen from angir tabellbufferen der kolonnene finnes. |
Velg setningssyntaks |
| gruppe | En del av setningsdelen group by i en select setning. |
Velg setningssyntaks |
| if | Betinget kjøring. | hvis og hvis ... andre setninger |
| Implementerer | Implementering av en interface. |
Oversikt over grensesnitt |
| insert_recordset | Kopierer data fra én eller flere tabeller til én resulterende måltabell på én enkelt servertur. | insert_recordset |
| int | Angir en variabel av typen integer (32-biters). |
Heltall |
| int64 | Angir en variabel av typen integer (64-biters). |
Heltall |
| grensesnitt | Grensesnittdeklarasjon. | Oversikt over grensesnitt |
| er | Spør om objektet det refereres til av en klassevariabel, enten arver fra den angitte klassen eller er av den angitte klassen. Gitt for eksempel en Derived klasse som utvider en Base klasse, returnerer uttrykket (myDerived is Base)sann. Dette nøkkelordet gjelder klassearv og tabellarv. |
Uttrykksoperatorer: Is og As for Inheritance |
| join | Tabeller er sammenføyd i kolonner som er felles for begge tabellene. Du kan generere ett enkelt resultatsett basert på flere tabeller ved hjelp av sammenføyninger. | Velg setningssyntaks |
| som | Tester for treff etter mønster, med jokertegnene *og '?'. | Relasjonsoperatorer |
| maxof | Returnerer maksimalt antall felt fra radene som er angitt av setningsdelen group by . |
Velg setningssyntaks |
| minof | Returnerer minimum av feltene fra radene som er angitt av setningsdelen group by . |
Velg setningssyntaks |
| mod | Returnerer heltallet som gjenstår av venstre uttrykk1 dividert med høyre uttrykk2. Uformelt kalles dette noen ganger modulooperatoren.
(12 mod 7) == 5 er sant. |
|
| ny | Operatør. Oppretter en forekomst av en klasse eller tildeler minne for en matrise. | |
| neste | Henter den neste posten i en tabell eller kaller opp neste metode i en kommandokjedesekvens. | |
| noFetch | Angir at ingen poster skal hentes nå. | Velg setningssyntaks |
| notExists | Brukes med join setningsdeler i select setninger. |
Velg setningssyntaks |
| null | Symbolsk konstant. | |
| optimisticLock | Tvinger en setning til å kjøre med optimistisk samtidighetskontroll, selv om en annen verdi er angitt i tabellen. | Velg setningssyntaks |
| orden | En del av setningsdelen order by i en select setning. |
Velg setningssyntaks |
| ytre | ytre sammenføyning. | Velg setningssyntaks |
| pause | Stanser utførelsen av en jobb. Brukeren blir bedt om å angi om kjøringen skal fortsette. Du bør ikke bruke denne setningen i produksjonskode. | Velg setninger |
| pessimistisklock | Tvinger en setning til å kjøre med pessimistisk samtidighetskontroll, selv om en annen verdi er angitt i tabellen. | Velg setningssyntaks |
| trykke | Lar deg vise utdata på skjermen. Du bør ikke bruke denne setningen i produksjonskode. | Skriv ut setninger |
| privat | Endring av metodetilgang. Metoden kan bare brukes i klassen som erklærer metoden. | Metodetilgangskontroll |
| beskyttet | Endring av metodetilgang. Metoden kan brukes fra metoder i klassen som deklarerer metodene, og i alle avledede klasser. | Metodetilgangskontroll |
| offentlig | Endring av metodetilgang. Metoden kan kalles fra en hvilken som helst klasse. | Metodetilgangskontroll |
| ekte | Angir real typen, en desimaltype uten avrundingsfeil. |
Reals |
| repeatableRead | Angir at ingen andre transaksjoner kan endre data som er lest av logikk i den gjeldende transaksjonen, før etter at den gjeldende transaksjonen er fullført. En eksplisitt transaksjon fullføres enten på ttsAbort eller på den ytterste ttsCommit. For et frittstående utvalgsuttrykk er transaksjonsvarigheten varigheten for utvalgskommandoen . Databasen håndhever imidlertid noen ganger tilsvarende repeatableRead i individuelle utvalgssetninger , selv uten at dette nøkkelordet vises i X++-koden (avhengig av hvordan databasen bestemmer seg for å skanne tabellene). | Hvis du vil ha mer informasjon, kan du se dokumentasjonen for det underliggende relasjonsdatabaseproduktet. |
| Prøve | Brukes i unntaksbehandling. | Unntaksbehandling med forsøk og fange opp nøkkelord |
| retur | Returnerer fra en metode. | Deklarasjon av metoder |
| omvendt | Poster returneres i omvendt rekkefølge. | Velg setningssyntaks |
| velge | Setningsdelen select angir hvilke kolonner eller visninger som vises i resultatsettet. |
Velg setninger |
| server | Metodeendring. Denne modifikasjonen ignoreres og bør ikke brukes, siden alle metoder kjøres på serversiden. | Method Modifiers |
| innstilling | Brukes med kommandoen update_recordset . | update_recordset |
| statisk | Statiske metoder kan ikke referere til forekomstvariabler (bare til statiske variabler). kan aktiveres ved hjelp av klassenavnet i stedet for i en forekomst av klassen ("MyClass.aStaticProcedure"). |
Method Modifiers |
| Str | Angir string typen. |
Strenger |
| sum | Returnerer summen av feltene fra radene som er angitt av setningsdelen group by i en select setning. |
Velg setningssyntaks |
| super | Kaller opp metoden som ble overstyrt av gjeldende metode. | Tabellmetoder |
| bryter | Bytt setning. | Bytt setninger |
| tableLock | Foreldet; tableLock er ikke lenger tilgjengelig. | |
| denne | En referanse til den gjeldende forekomsten av klassen. Brukes i X++-kode i en forekomstmetode for klassen. Brukes til å referere til metodemedlemmer i klassen. | |
| kaste | Brukes i unntaksbehandling. | Unntaksbehandling med forsøk og fange opp nøkkelord |
| sann | Boolsk litteral. | Booleans |
| forsøke | Brukes i unntaksbehandling. | Unntaksbehandling med forsøk og fange opp nøkkelord |
| ttsAbort | Rull tilbake (dvs. forkast) alle endringer i den gjeldende transaksjonen. | Transaksjonsintegritet |
| ttsBegin | Markerer begynnelsen på en transaksjon. | Transaksjonsintegritet |
| ttsCommit | Markerer slutten på en transaksjon, og utfører endringene i tabellene. | Transaksjonsintegritet |
| update_recordset | Tillater manipulering av radsett i én operasjon. | update_recordset |
| validTimeState | Filtrerer rader som hentes fra en gyldig tidstilstandstabell med en X++ SQL-setning select . For eksempel: velg validTimeState(myDateEffective) * fra xMyTable; ... eller... velg validTimeState(myDateFrom, myDateTo) * fra xMyTable; |
Effekter av gyldige tidstilstandstabeller på lese- og skriveoperasjoner |
| tomrom | Identifiserer en metode som ikke returnerer en verdi. | Deklarasjon av metoder |
| hvor | En del av en select setning. Setningsdelen where angir betingelsene som skal tilfredsstilles. Det vil si radene du vil inkludere i resultatet. |
Velg setningssyntaks |
| mens | Gjentakelseserklæring. Utfører en setning gjentatte ganger så lenge testbetingelsen er sann. | Mens løkker mens du velger setninger |
| vindu | Lar deg endre størrelsen på utdatavinduet. Brukes med utskrifts-</utskriftssetninger> som ikke anbefales i produksjonskode. |
Skriv ut setninger |
Syntaks for uttrykk
Et uttrykk i X++ brukes på en matematisk eller logisk måte. Uttrykk er bygd på datatypene for språket. det vil eksempel: Et uttrykk returnerer alltid en verdi av en type. Denne verdien kan brukes i beregninger, tildelinger, betingede setninger og så videre.
EBNF-beskrivelse av uttrykk i X++
| Term | Definisjon | |
|---|---|---|
| Expression | = | Enkeltuttrykk [RelationalOperator Simple-expression ] |
| RelationalOperator | = | = |
| Enkelt uttrykk | = | Enkelt uttrykk [ + |
| Term | = | Compfactor { Mult-operator CompFactor } |
| Mult-operator | = | * |
| CompFactor | = | [ ! ] [ - |
| Omregningsfaktor | = | Bokstavelig |
| Opplisting | = | EnumName :: Litteral |
| Variabel | = | Identifikator [ [ Uttrykk ] ] [ . Uttrykk ] |
| FunctionCall | = | [ Uttrykk (. |
| Hvis-uttrykk | = | Uttrykk? Uttrykk : Uttrykk |
Semantiske begrensninger gjelder for den foregående syntaksen. Du kan ikke kalle opp noen metode ved hjelp av operatoren :: . På samme måte kan du ikke bruke dette nøkkelordet uten et aktivt objekt. det vil si, hvis du ikke er innenfor en forekomstmetode og så videre.
Eksempler
| Eksempel på uttrykk | beskrivelse |
|---|---|
1 |
En heltallslitteral. |
| NoYes::Nei | En opplistingsreferanse. |
A |
En variabelreferanse. |
| Debitor::Find("1") | Et statisk metodekall (returnerer en kundevariabel). |
| (A > 3 ? true : false) | Et hvis-uttrykk som returnerer sann eller usann. |
| (velg CustTable der CustTable.Account == "100"). NameRef | Et utvalg-uttrykk. Returnerer nameref-feltet i kundetabellen. Dette er en streng. |
| A >= B | Et logisk uttrykk. Returnerer sann eller usann. |
| A + B | Et aritmetisk uttrykk. Summerer A og B. |
| A + B / C | Beregner B/C, og legger deretter til dette i A. |
| ~A + dette. Value() | Summerer binærtallet ikke A, og resultatet av metodekallet Verdi på objektet i omfang (dette). |
| Debitor::Find("1"). NameRef | Returnerer NameRef-feltet for den funnet kundeposten. |
| Debitor::Find("1"). Saldo() | Et metodekall i Balance kundetabellen (Debitor::Søk returnerer en kunde). Returnerer saldoen for kunden med kontonummer 1. |
Oversikt over EBNF
Extended Backus Naur Form (EBNF) er en metallfiske og brukes i denne veiledningen til å beskrive språksyntaksen. En EBNF-definisjon består av produksjonsregler, ikke-terminaler og terminaler. Nøkkeltermene vises i tabellen nedenfor.
| Viktige termer | Eksempel | beskrivelse |
|---|---|---|
| Terminaler | Work_Team | En terminal er ett tegn eller en streng med tegn som aldri endres. |
| Ikke-terminaler | Employee |
En nonterminal er en beskrivelse av en del av en gyldig setning på språket som er definert enten av en produksjonsregel eller en tekstbeskrivelse. Et ikke-terminalsymbol kan alltid utvides til ett eller flere terminalsymboler. |
| Produksjonsregler | Ansatt = Utvikler | Tester |
Eksempel
Work_Team = Leder ansatt {, Ansatt} Ansatt = Utvikler | Tester Dette eksemplet definerer en Work_Team som består av en Manager og én eller flere Employees. En Employee er definert som en Developer, eller en Tester. Symbolene som brukes i eksemplet, er beskrevet i tabellen nedenfor.
Spesielle symboler i EBNF
| Symbol | beskrivelse |
|---|---|
| (Uttrykk) | Parenteser holder symbolene (terminaler og ikke-terminaler) sammen. De kan plasseres hvor som helst på høyre side av en produksjonsregel. |
| Uttrykk1 | Uttrykk 2 |
| [Uttrykk] | Valgfritt: Elementene mellom [ og ] er valgfrie. Alle eller ingen av elementene i hakeparentesene er inkludert. |
| {Expression} | Gjenta: Elementene mellom { og } er valgfrie, men kan gjentas så mange ganger som nødvendig. |
Hvis for eksempel tilbehøret du kjøper til sykkelen består av en sal, vannflaskeholdere, bjeller og horn, og du kan ha enten en klokke eller et horn, og null, en eller flere vannflaskeholdere og nøyaktig én sal, kan dette uttrykkes som: Bicycle_Accessories = sal [bell | horn] {water_bottle_holders} Denne grammatikken definerer følgende muligheter: saddlesaddle bellsaddle horn sal water_bottle_holder salklokke water_bottle_holder sadelklokke water_bottle_holder water_bottle_holder og så videre.
X++ Grammatikk
Denne artikkelen viser den formelle grammatikken for X++-språket.
Slik tolker du den formelle BNF-grammatikken
Denne delen beskriver grammatikken til X++ i Backus Naur Form (BNF). Et lite eksempel på BNF er beskrevet her.
AA ::= BB CC_SYM
BB ::= JJ_SYM
::= KK_SYM
AA er navnet på en produksjonsregel. En AA krever en BB, etterfulgt av en CC_SYM. A BB er også en produksjonsregel.
BB Derfor er ikke en terminal.
BB må være enten en JJ_SYM eller en KK_SYM. Både JJ_SYM og KK_SYM er terminaler fordi de ikke er navnene på andre produksjonsregler. CC_SYM er også en terminal.
I BNF for X++ grammatikk har de fleste terminalene _SYM som suffikset av navnet.
Formell X++ grammatikk i BNF
Denne delen inneholder BNF som definerer grammatikken til X++.
CMPL_UNIT ::= RETTYPEID FUNC_HDR FUNC_HEAD BODY
::= RETTYPEID DATA_HDR CLASS_DECL
::= EXPR_HDR IF_EXPR SEMIOPT
::= RETTYPEID FUNC_HDR EVENT_DECL BODY
SEMIOPT ::= SEMICOLON_SYM
::=
CLASS_DECL ::= CLASS_HEADER LEFTBR_SYM DCL_EVENTMAP DCL_LIST RIGHTBR_SYM
CLASS_HEADER ::= ATTRIBUTE_DEF CLASS_MODIFIERS CLASSORINTERFACE STD_ID EXTENDS IMPLEMENTS
ATTRIBUTE_DEF ::= LEFT_BRKT_SYM ATTRIBUTE_INIT ATTRIBUTE_LIST RETTYPEID RGHT_BRKT_SYM
::=
ATTRIBUTE_INIT ::=
.
ATTRIBUTE_LIST ::= ATTRIBUTE
::= ATTRIBUTE_LIST LIST_SEP_SYM ATTRIBUTE
ATTRIBUTE ::= STD_ID
::= ATTRIBUTE_WITH_ARGS_BEGINS ATTRIBUTE_WITH_ARGS_ENDS
ATTRIBUTE_WITH_ARGS_BEGINS ::= STD_ID LEFT_PAR_SYM
ATTRIBUTE_WITH_ARGS_ENDS ::= ATTRIBUTE_ARGS RGHT_PAR_SYM
ATTRIBUTE_ARGS ::= ATTRIBUTE_CONSTANT
::= ATTRIBUTE_ARGS LIST_SEP_SYM ATTRIBUTE_CONSTANT
ATTRIBUTE_CONSTANT ::= INT_SYM
::= DBL_SYM
::= STR_SYM
::= DATE_SYM
::= DATETIME_SYM
::= STD_ID DBLCOLON_SYM STD_ID
::= TRUE_SYM
::= FALSE_SYM
::= INT64_SYM
::= ATTRIBUTE_INTRINSIC
ATTRIBUTE_INTRINSIC ::= INTRI_ID LEFT_PAR_SYM IARGS RGHT_PAR_SYM
CLASSORINTERFACE ::= CLASS_SYM
::= INTERFACE_SYM
CLASS_MODIFIERS ::= CLASS_MODS
::=
CLASS_MODS ::= CLASS_MODIFIER
::= CLASS_MODS RETTYPEID CLASS_MODIFIER
CLASS_MODIFIER ::= PUBLIC_SYM
::= FINAL_SYM
::= STATIC_SYM
::= ABSTRACT_SYM
::= PRIVATE_SYM
EXTENDS ::= EXTENDS_SYM STD_ID
::=
IMPLEMENTS ::= IMPLEMENTS_SYM IMPLEMENTLIST
::=
IMPLEMENTLIST ::= STD_ID
::= IMPLEMENTLIST LIST_SEP_SYM STD_ID
DCL_EVENTMAP ::=
EVENT_DECL ::= ATTRIBUTE_DEF EVENT_HEADER PARM_DCL_LIST
EVENT_HEADER ::= EVENT_MODIFIER VOID_TYPE_SYM STD_ID
EVENT_MODIFIER ::= EVENT_SYM
FUNC_HEAD ::= ATTRIBUTE_DEF FUNCNAME PARM_DCL_LIST
FUNCNAME ::= FUNCTYPE STD_ID
FUNCTYPE ::= FUNC_MODIFIERS DECL_TYPE
FUNC_MODIFIERS ::= FUNC_MODS
::=
FUNC_MODS ::= RETTYPEID FUNC_MODIFIER
::= FUNC_MODS RETTYPEID FUNC_MODIFIER
FUNC_MODIFIER ::= PUBLIC_SYM
::= PRIVATE_SYM
::= PROTECTED_SYM
::= FINAL_SYM
::= STATIC_SYM
::= ABSTRACT_SYM
::= DISPLAY_SYM
::= EDIT_SYM
::= SERVER_SYM
::= CLIENT_SYM
BODY ::= LEFTBR_SYM DCL_FUNC_LIST SEMIOPT SECAUTHZCHECK STMTLIST SECAUTHZEND RIGHTBR_SYM
SECAUTHZCHECK ::=
SECAUTHZEND ::=
RETTYPEID ::=
FUNCTION_DEF ::= FUNC_HEADER PARM_DCL_LIST LOCAL_BODY
FUNC_HEADER ::= DECL_TYPE STD_ID
PARM_DCL_LIST ::= RETTYPEID PARM_START PARM_LIST_OPT RGHT_PAR_SYM RETTYPEID
PARM_START ::= LEFT_PAR_SYM
PARM_LIST_OPT ::= PARM_LIST
::=
PARM_LIST ::= DCL_INIT
::= PARM_LIST LIST_SEP_SYM DCL_INIT
LOCAL_BODY ::= LEFTBR_SYM DCL_LIST SEMIOPT STMTLIST RETTYPEID RIGHTBR_SYM
DCL_LIST ::= DCL_LIST2
::=
DCL_LIST2 ::= DCL_STMT
::= DCL_LIST2 DCL_STMT
DCL_FUNC_LIST ::= DCL_FUNC_LIST2
::=
DCL_FUNC_LIST2 ::= DCL_STMT
::= FUNCTION_DEF
::= DCL_FUNC_LIST2 DCL_STMT
::= DCL_FUNC_LIST2 FUNCTION_DEF
DCL_STMT ::= DCL_INIT_LIST RETTYPEID SEMICOLON_SYM
DCL_INIT_LIST ::= DCL_INIT
::= DCL_CLIST ASG_CLAUSE
DCL_CLIST ::= DCL_INIT_LIST LIST_SEP_SYM STD_ID ARR_DCL_IDX
DCL_INIT ::= DECL ASG_CLAUSE
DECL ::= DECL_TYPE STD_ID ARR_DCL_IDX
DECL_TYPE ::= STR_TYPE_SYM STR_LEN
::= INT_TYPE_SYM
::= DBL_TYPE_SYM
::= DATE_TYPE_SYM
::= DATETIME_TYPE_SYM
::= TYPE_ID
::= QUEUE_TYPE_SYM
::= VOID_TYPE_SYM
::= ANY_TYPE_SYM
::= GUID_TYPE_SYM
::= INT64_TYPE_SYM
::= CLR_TYPE
CLR_TYPE ::= CLR_NAMESPACE TYPE_ID CLR_ARRAY_TYPE_EXT
::= CLR_NAMESPACE CLR_TYPE
CLR_NAMESPACE ::= TYPE_ID PERIOD_SYM
CLR_ARRAY_TYPE_EXT ::= CLR_ARRAY_SPEC
::=
CLR_ARRAY_SPEC ::= CLR_ARRAY_PART
::= CLR_ARRAY_SPEC CLR_ARRAY_PART
CLR_ARRAY_PART ::= CLR_ARRAY_LEFT_PART CLR_RECTANGULAR_LIST RGHT_BRKT_SYM
CLR_ARRAY_LEFT_PART ::= LEFT_BRKT_SYM
CLR_RECTANGULAR_LIST ::= CLR_COMMA_LIST
::=
CLR_COMMA_LIST ::= LIST_SEP_SYM
::= CLR_COMMA_LIST LIST_SEP_SYM
STR_LEN ::= INT_SYM
::=
ARR_DCL_IDX ::= LEFT_BRKT_SYM RANGE ARRAY_MEM RGHT_BRKT_SYM
::=
RANGE ::= IF_EXPR
::=
ARRAY_MEM ::= LIST_SEP_SYM IF_EXPR
::=
ASG_CLAUSE ::= INIT_START IF_EXPR
::=
INIT_START ::= ASG_SYM
ASG_STMT ::= LVAL_FLD ASSIGN IF_EXPR
::= LVAL_LIST ASG_SYM IF_EXPR
::= LVAL_FLD ASG_INC_DEC
::= ASG_INC_DEC LVAL_FLD
::= LVAL_FLD ASG_EVENT_HANDLER
ASSIGN ::= ASG_SYM
::= ASGINC_SYM
::= ASGDEC_SYM
ASG_INCDEC ::= ASGINC_SYM
::= ASGDEC_SYM
ASG_EVENT_HANDLER ::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM QUALIFIER STD_ID RGHT_PAR_SYM
::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM STD_ID DBLCOLON_SYM STD_ID RGHT_PAR_SYM
::= ASG_INCDEC EVENTHANDLER_SYM LEFT_PAR_SYM QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID RGHT_PAR_SYM
ASG_INC_DEC ::= INC_SYM
::= DEC_SYM
LVAL_FLD ::= FIELD
LVAL_START ::= LEFT_BRKT_SYM
LVAL_LIST ::= LVAL_START LVALUES RGHT_BRKT_SYM
LVALUE ::= FIELD
LVALUES ::= LVALUE
::= LVALUES NEXTLVAL LVALUE
NEXTLVAL ::= LIST_SEP_SYM
IF_EXPR ::= COND_TRUE IF_EXPR
::= BOOL_EXPR
COND_TRUE ::= COND_TEST IF_EXPR COLON_SYM
COND_TEST ::= BOOL_EXPR QUEST_SYM
BOOL_EXPR ::= BOOL_EXPR LOGOP EXPR
::= EXPR
LOGOP ::= AND_SYM
::= OR_SYM
EXPR ::= SMPL_EXPR RELOP SMPL_EXPR
::= SMPL_EXPR AS_SYM STD_ID
::= SMPL_EXPR IS_SYM STD_ID
::= SMPL_EXPR AS_SYM EVAL_CLR_TYPE
::= SMPL_EXPR IS_SYM EVAL_CLR_TYPE
::= SMPL_EXPR
RELOP ::= LT_SYM
::= LE_SYM
::= EQ_SYM
::= NE_SYM
::= GT_SYM
::= GE_SYM
::= LIKE_SYM
SMPL_EXPR ::= SMPL_EXPR ADDOP TERM
::= TERM
ADDOP ::= PLUS_SYM
::= MINUS_SYM
::= PHYSOR_SYM
TERM ::= TERM MULOP CMPL_FACT
::= CMPL_FACT
MULOP ::= MULT_SYM
::= DIV_SYM
::= MOD_SYM
::= INTDIV_SYM
::= SHIFTL_SYM
::= SHIFTR_SYM
::= PHYSAND_SYM
::= PHYSXOR_SYM
CMPL_FACT ::= NOT_SYM SGND_FACT
::= SGND_FACT
SGND_FACT ::= SIGNOP FACTOR
::= FACTOR
SIGNOP ::= UMINUS_SYM
::= PHYSNOT_SYM
FACTOR ::= LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
::= CONSTANT
::= FIELD
::= DIRSEARCH
::= FUNCTION
::= INTRINSICS
::= EVAL
::= CONLITTERAL
::= NEW_CLR_ARRAY
NEW_CLR_ARRAY ::= NEW_SYM EVAL_CLR_TYPE NEW_CLR_ARRAY_PART LEFT_PAR_SYM RGHT_PAR_SYM
NEW_CLR_ARRAY_PART ::= CLR_SIZED_ARRAY CLR_NOSIZED_ARRAY_SPEC
CLR_SIZED_ARRAY ::= LEFT_BRKT_SYM CLR_SMPL_EXPR_COMMA_LIST RGHT_BRKT_SYM
CLR_SMPL_EXPR_COMMA_LIST ::= SMPL_EXPR
::= CLR_SMPL_EXPR_COMMA_LIST LIST_SEP_SYM SMPL_EXPR
CLR_NOSIZED_ARRAY_SPEC ::= CLR_NOSIZED_ARRAY_LIST
::=
CLR_NOSIZED_ARRAY_LIST ::= CLR_NOSIZED_ARRAY
::= CLR_NOSIZED_ARRAY_LIST CLR_NOSIZED_ARRAY
CLR_NOSIZED_ARRAY ::= LEFT_BRKT_SYM CLR_EMPTY_COMMA_LIST RGHT_BRKT_SYM
CLR_EMPTY_COMMA_LIST ::= CLR_EMPTY_RECT_COMMA_LIST
::=
CLR_EMPTY_RECT_COMMA_LIST ::= LIST_SEP_SYM
::= CLR_EMPTY_RECT_COMMA_LIST LIST_SEP_SYM
CONLITTERAL ::= LEFT_BRKT_SYM IF_EXPR EXPR_LIST RGHT_BRKT_SYM
CONSTANT ::= INT_SYM
::= DBL_SYM
::= STR_SYM
::= DATE_SYM
::= DATETIME_SYM
::= STD_ID DBLCOLON_SYM STD_ID
::= TRUE_SYM
::= FALSE_SYM
::= NULL_SYM
::= INT64_SYM
::= QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID
::= QUALIFIER STD_ID DBLCOLON_SYM STD_ID
DIRSEARCH ::= DIRS_HEADER PERIOD_SYM STD_ID ARR_IDX
::= DIRS_HEADER PERIOD_SYM FLD_NUM ARR_IDX
DIRS_HEADER ::= LEFT_PAR_SYM SET_DIRS FIND_JOIN RGHT_PAR_SYM
SET_DIRS ::=
FIELD ::= QUALIFIER STD_ID ARR_IDX
::= QUALIFIER FLD_NUM ARR_IDX
::= STD_ID ARR_IDX
QUALIFIER ::= EVAL PERIOD_SYM
::= STD_ID PERIOD_SYM
FLD_NUM ::= LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
ARR_IDX ::= LEFT_BRKT_SYM SMPL_EXPR RGHT_BRKT_SYM
::=
EXPR_LIST ::= EXPR_LIST2
::=
EXPR_LIST2 ::= LIST_SEP_SYM IF_EXPR
::= EXPR_LIST2 LIST_SEP_SYM IF_EXPR
FUNCTION ::= FUNC_ID LEFT_PAR_SYM EVAL_FUNCTION_NAME PAR_LIST RGHT_PAR_SYM
EVAL_FUNCTION_NAME ::=
EVAL_NAME ::= EVAL_ID LEFT_PAR_SYM
::= STD_ID LEFT_PAR_SYM
::= STD_ID DBLCOLON_SYM STD_ID LEFT_PAR_SYM
::= SUPER_SYM LEFT_PAR_SYM
::= NEW_SYM STD_ID LEFT_PAR_SYM
::= NEW_SYM EVAL_CLR_TYPE LEFT_PAR_SYM
::= QUALIFIER EVAL_CLR_TYPE DBLCOLON_SYM STD_ID LEFT_PAR_SYM
::= QUALIFIER STD_ID LEFT_PAR_SYM
::= QUALIFIER STD_ID DBLCOLON_SYM STD_ID LEFT_PAR_SYM
EVAL_CLR_TYPE ::= NAMESPACE STD_ID
::= NAMESPACE EVAL_CLR_TYPE
NAMESPACE ::= STD_ID PERIOD_SYM
EVAL ::= EVAL_NAME PAR_LIST RGHT_PAR_SYM
PAR_LIST ::= PRM_LIST
::=
PRM_LIST ::= PAR_ELEM
::= PRM_LIST LIST_SEP_SYM PAR_ELEM
PAR_ELEM ::= IF_EXPR
::= BYREF_SYM FIELD
INTRINSICS ::= INTRI_ID LEFT_PAR_SYM IARGS RGHT_PAR_SYM
IARGS ::= STD_ID
::= STR_SYM
::= STD_ID LIST_SEP_SYM STD_ID
::=
STMTLIST ::= STATEMENTS
::=
STATEMENTS ::= STATEMENT
::= STATEMENTS STATEMENT
STATEMENT ::= COMPOUND_STMT
::= WHILE_STMT
::= FOR_STMT
::= DO_STMT
::= SEARCH_STMT
::= FIND_STMT
::= PRINT_STMT
::= WINDOW_STMT
::= IF_STMT
::= SWITCH_STMT
::= EXPR_STMT
::= PAUSE_STMT
::= BP_CLAUSE
::= BREAK_STMT
::= CONTINUE_STMT
::= RETURN_CLAUSE
::= MOVE_REC_STMT
::= THROW_STMT
::= TRY_STMT
::= RETRY_STMT
::= TTS_STMT
::= FLUSH_STMT
::= TBLLOCK_STMT
::= CHANGE_STMT
::= UPDATE_STMT
::= INSERT_STMT
::= UNCHECKED_STMT
COMPOUND_STMT ::= LEFTBR_SYM STMTLIST RIGHTBR_SYM
THROW_STMT ::= THROW_SYM IF_EXPR SEMICOLON_SYM
TRY_STMT ::= TRY_BLOCK CATCH_LIST
TRY_BLOCK ::= TRY_START STATEMENT
TRY_START ::= TRY_SYM
CATCH_LIST ::= CATCH_STMT
::= CATCH_LIST CATCH_STMT
CATCH_STMT ::= CATCH_EXPR PRE_CATCH STATEMENT POST_CATCH
CATCH_EXPR ::= CATCH_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
::= CATCH_SYM LEFT_PAR_SYM IF_EXPR LIST_SEP_SYM TABLEINSTANCE RGHT_PAR_SYM
::= CATCH_SYM
PRE_CATCH ::=
POST_CATCH ::=
TABLEINSTANCE ::= INSTANCENAME
INSTANCENAME ::= QUALIFIER STD_ID ARR_IDX
::= STD_ID ARR_IDX
RETRY_STMT ::= RETRY_SYM SEMICOLON_SYM
WHILE_STMT ::= WHILE_TEST STATEMENT
WHILE_TEST ::= WHILE LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
WHILE ::= WHILE_SYM
DO_STMT ::= DO_BODY DO_TEST SEMICOLON_SYM
DO_BODY ::= DO_HEADER STATEMENT
DO_HEADER ::= DO_SYM
DO_TEST ::= WHILE_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
FOR_STMT ::= FOR_HEADER STATEMENT
FOR_HEADER ::= FOR_TEST SEMICOLON_SYM FOR_ASG RGHT_PAR_SYM
FOR_TEST ::= FOR_INIT SEMICOLON_SYM IF_EXPR
FOR_INIT ::= FOR_SYM LEFT_PAR_SYM FOR_ASG
FOR_ASG ::= LVAL_FLD ASSIGN IF_EXPR
::= LVAL_FLD ASG_INC_DEC
::= ASG_INC_DEC LVAL_FLD
JOIN_LIST ::= JOIN_SPECS
::=
JOIN_SPECS ::= JOIN_SPEC
::= JOIN_SPECS JOIN_SPEC
JOIN_SPEC ::= JOIN_ORDER WHERE IF_EXPR
::= JOIN_ORDER
JOIN_ORDER ::= JOIN_USING
::= JOIN_USING ORDER_GROUP
JOIN_USING ::= JOIN_CLAUSE USING_INDEX STD_ID
::= JOIN_CLAUSE USING_INDEX HINT_SYM STD_ID
::= JOIN_CLAUSE
JOIN_CLAUSE ::= OUTER JOIN_SYM SELECTOPT TABLE
OUTER ::= OUTER_SYM
::= EXISTS_SYM
::= NOTEXISTS_SYM
::=
SEARCH_STMT ::= SEARCH_JOIN STATEMENT
SEARCH_JOIN ::= SEARCH_WHERE JOIN_LIST
SEARCH_WHERE ::= SEARCH_ORDER WHERE IF_EXPR
::= SEARCH_ORDER
WHERE ::= WHERE_SYM
SUM_ELEM ::= SUM_FUNC LEFT_PAR_SYM STD_ID RGHT_PAR_SYM
SUM_FUNC ::= SUM_SYM
::= AVG_SYM
::= CNT_SYM
::= MINOF_SYM
::= MAXOF_SYM
SEARCH_ORDER ::= SEARCH_USING
::= SEARCH_USING ORDER_GROUP
ORDER_GROUP ::= ORDERBY_CLAUSE OPT_GROUPBY
::= GROUPBY_CLAUSE OPT_ORDERBY
OPT_GROUPBY ::= GROUPBY_CLAUSE
::=
OPT_ORDERBY ::= ORDERBY_CLAUSE
::=
ORDERBY_CLAUSE ::= ORDER_SYM OPT_BY ORDER_ELEM
::= ORDERBY_CLAUSE LIST_SEP_SYM ORDER_ELEM
GROUPBY_CLAUSE ::= GROUP_SYM OPT_BY ORDER_ELEM
::= GROUPBY_CLAUSE LIST_SEP_SYM ORDER_ELEM
ORDER_ELEM ::= STD_ID INDEX DIRECTION
::= ORDER_QUALIFIER STD_ID INDEX DIRECTION
ORDER_QUALIFIER ::= STD_ID PERIOD_SYM
INDEX ::= LEFT_BRKT_SYM INT_SYM RGHT_BRKT_SYM
::=
DIRECTION ::= ASCEND_SYM
::= DESCEND_SYM
::=
OPT_BY ::= BY_SYM
::=
SEARCH_USING ::= SEARCH_CLAUSE USING_INDEX STD_ID
::= SEARCH_CLAUSE USING_INDEX HINT_SYM STD_ID
::= SEARCH_CLAUSE
USING_INDEX ::= INDEX_SYM
SEARCH_CLAUSE ::= WHILE_SYM SELECT_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
CROSSCOMPANY_CLAUSE ::= CROSSCOMPANY_SYM
::= CROSSCOMPANY_SYM COLON_SYM STD_ID
::=
VALIDTIMESTATE_CLAUSE ::= VALIDTIMESTATE_SYM LEFT_PAR_SYM STD_ID LIST_SEP_SYM STD_ID RGHT_PAR_SYM
::= VALIDTIMESTATE_SYM LEFT_PAR_SYM STD_ID RGHT_PAR_SYM
::=
SELECTOPT ::=
::= SELECTOPT REVERSE_SYM
::= SELECTOPT FIRSTFAST_SYM
::= SELECTOPT FIRSTONLY_SYM
::= SELECTOPT FIRSTONLY_SYM1
::= SELECTOPT FIRSTONLY_SYM10
::= SELECTOPT FIRSTONLY_SYM100
::= SELECTOPT FIRSTONLY_SYM1000
::= SELECTOPT FORUPDATE_SYM
::= SELECTOPT NOFETCH_SYM
::= SELECTOPT FORCE_SELECT_ORDER_SYM
::= SELECTOPT FORCE_NESTED_LOOP_SYM
::= SELECTOPT FORCE_LITERALS_SYM
::= SELECTOPT FORCE_PLACEHOLDERS_SYM
::= SELECTOPT REPEATABLEREAD_SYM
::= SELECTOPT OPTIMISTICLOCK_SYM
::= SELECTOPT PESSIMISTICLOCK_SYM
::= SELECTOPT GENERATEONLY_SYM
FIND_STMT ::= FIND_JOIN SEMICOLON_SYM
FIND_JOIN ::= FIND_WHERE JOIN_LIST
FIND_WHERE ::= FIND_ORDER WHERE IF_EXPR
::= FIND_ORDER
FIND_ORDER ::= FIND_USING
::= FIND_USING ORDER_GROUP
FIND_USING ::= FIND_TABLE USING_INDEX STD_ID
::= FIND_TABLE USING_INDEX HINT_SYM STD_ID
::= FIND_TABLE
FIND_TABLE ::= SELECT_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
::= DELETE_SYM SELECTOPT CROSSCOMPANY_CLAUSE VALIDTIMESTATE_CLAUSE TABLE
TABLE ::= FLD_LIST OPT_FROM
FLD_LIST ::= MULT_SYM
::= FIELD_LIST
FIELD_LIST ::= FIELD_SPEC
::= FIELD_LIST LIST_SEP_SYM FIELD_SPEC
FIELD_SPEC ::= STD_ID INDEX
::= SUM_ELEM
OPT_FROM ::= FROM_SYM STD_ID
::=
SETFIELDSMODE ::=
UPDATE_STMT ::= UPDATETABLE SET_SYM SETFIELDSMODE FIELDASSIGNMENTS OPT_WHERE JOIN_LIST SEMICOLON_SYM
UPDATETABLE ::= UPDATE_SYM SELECTOPT CROSSCOMPANY_CLAUSE STD_ID
OPT_WHERE ::= WHERE IF_EXPR
::=
FIELDASSIGNMENTS ::= FIELDASSIGNMENTS LIST_SEP_SYM FIELDASSIGNMENT
::= FIELDASSIGNMENT
FIELDASSIGNMENT ::= STD_ID INDEX ASG_SYM IF_EXPR
INSERT_PART ::= INSERT_SYM CROSSCOMPANY_CLAUSE INSERT_NAME LEFT_PAR_SYM INSERTFIELDLIST RGHT_PAR_SYM
INSERT_NAME ::= STD_ID
INSERT_STMT ::= INSERT_PART FIND_JOIN SEMICOLON_SYM
INSERTFIELDLIST ::= INSERTFIELD
::= INSERTFIELDLIST LIST_SEP_SYM INSERTFIELD
INSERTFIELD ::= STD_ID INDEX
PRINT_STMT ::= PRINT_CLAUSE AT_CLAUSE SEMICOLON_SYM
PRINT_CLAUSE ::= PRINT IF_EXPR EXPR_LIST
PRINT ::= PRINT_SYM
AT_CLAUSE ::= AT_SYM IF_EXPR LIST_SEP_SYM IF_EXPR
::=
WINDOW_STMT ::= WINDOW_SYM IF_EXPR LIST_SEP_SYM IF_EXPR AT_CLAUSE SEMICOLON_SYM
IF_STMT ::= ELSE_STMT
::= IF_CONDS
IF_CONDS ::= IF_COND STATEMENT
IF_COND ::= IF_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
ELSE_STMT ::= ELSE STATEMENT
ELSE ::= IF_CONDS ELSE_SYM
SWITCH_STMT ::= CASE_LIST RIGHTBR_SYM
CASE_LIST ::= SWITCH_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM LEFTBR_SYM
::= CASE_TESTS STMTLIST
CASE_TESTS ::= CASE_HEADER COLON_SYM
::= CASE_LIST DEFAULT_SYM COLON_SYM
CASE_HEADER ::= CASE IF_EXPR
::= CASEALT IF_EXPR
CASE ::= CASE_LIST CASE_SYM
CASEALT ::= CASE_HEADER LIST_SEP_SYM
EXPR_STMT ::= ASG_STMT SEMICOLON_SYM
::= FUNCTION SEMICOLON_SYM
::= INTRINSICS SEMICOLON_SYM
::= EVAL SEMICOLON_SYM
PAUSE_STMT ::= PAUSE_SYM SEMICOLON_SYM
BP_CLAUSE ::= BP_SYM SEMICOLON_SYM
BREAK_STMT ::= BREAK_SYM SEMICOLON_SYM
CONTINUE_STMT ::= CONTINUE_SYM SEMICOLON_SYM
RETURN_CLAUSE ::= RETURN_SYM SEMICOLON_SYM
::= RETURN_SYM IF_EXPR SEMICOLON_SYM
TTS_STMT ::= TTSABORT_SYM SEMICOLON_SYM
::= TTSBEGIN_SYM SEMICOLON_SYM
::= TTSEND_SYM SEMICOLON_SYM
FLUSH_STMT ::= FLUSH ID_LIST SEMICOLON_SYM
FLUSH ::= FLUSH_SYM
TBLLOCK_STMT ::= TABLELOCK ID_LIST SEMICOLON_SYM
TABLELOCK ::= TABLELOCK_SYM
ID_LIST ::= STD_ID
::= ID_LIST LIST_SEP_SYM STD_ID
MOVE_REC_STMT ::= NEXT_SYM TABLE SEMICOLON_SYM
CHANGE_STMT ::= CHANGE_HEADER STATEMENT
CHANGE_HEADER ::= CHANGE LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM
CHANGE ::= CHANGECOMP_SYM
::= CHANGESITE_SYM
UNCHECKED_STMT ::= UNCHECKED_HEADER STATEMENT
UNCHECKED_HEADER ::= UNCHECKED_SYM LEFT_PAR_SYM IF_EXPR RGHT_PAR_SYM