Condividi tramite


Sintassi X++

Nota

I gruppi di interesse della community sono ora passati da Yammer a Microsoft Viva Engage. Per entrare a far parte di una community Viva Engage e partecipare alle discussioni più recenti, compila il modulo Richiedi l'accesso alla community Viva Engage per Finance and Operations e scegli la community a cui vuoi unirti.

Questo articolo contiene le informazioni di riferimento sulla sintassi per X++.

Parole chiave X++

Le parole chiave X++ illustrate nella tabella seguente sono riservate. Queste parole chiave non possono essere utilizzate per altri scopi.

Parola riservata Descrizione Informazioni correlate
! Non. Operatori relazionali
!= Operatore di disuguaglianza (diverso da). Operatori relazionali
# Prefisso sui nomi delle macro. Procedura: utilizzare #define e #if per testare una macro
& Binario E. Operatori aritmetici
&& Logico AND. Operatori relazionali
( Operatore di chiamata di funzione, che indica l'inizio della chiamata di funzione.
) Operatore di chiamata di funzione, che indica la fine della chiamata di funzione.
* Moltiplicare. L'asterisco (*) viene utilizzato anche in X++ SQL. Un uso è quello di indicare tutti i campi delle tabelle su un'istruzione select . Un altro uso è come carattere jolly con l'operatore like , per indicare 0 a molti caratteri di qualsiasi tipo. L'operatore like utilizza anche il carattere ? . Operatori aritmetici
^ XOR binario. Operatori aritmetici
| Binario OR. Operatori aritmetici
|| Logico OR. Operatori relazionali
~ Non. Operatori aritmetici
+ Più. Operatori aritmetici
++ Aumento. Operatori di assegnazione
+= Assegnazione additiva. Operatori di assegnazione
, Operatore virgola. Le espressioni separate da virgole vengono valutate in sequenza da sinistra a destra.
- Meno. Operatori aritmetici
-- Operatore di decremento. Operatori di assegnazione
-= Assegnazione sottrattiva. Operatori di assegnazione
. L'operatore di accesso ai membri della classe, ad esempio, formRun.run accede al run metodo di un oggetto del tipo FormRundi classe .
/ Dividere. Operatori aritmetici
\ Fuga in stringhe. Esegue l'escape delle virgolette aggiuntive e di alcune lettere, ad esempio '\t' per la tabulazione.
@ Fuga di parole chiave. Ad esempio, var @str = 1@abstract; non riesce a compilare senza che il carattere che fa sì che qualsiasi @ stringa che lo segue venga considerata come un identificatore. Influisce anche sulle stringhe letterali, negando l'effetto del carattere \ escape e consentendo alla stringa di estendersi su più di una riga nel codice sorgente. La nuova riga è rappresentata da un carattere di 0x0A esadecimale, comunemente chiamato avanzamento riga. Non è incluso alcun carattere di ritorno a capo dei 0x0D esadecimali, come in 0x0D0A.
: I due punti (:) vengono utilizzati per delimitare i valori delle maiuscole e delle minuscole nell'istruzione switch .
:: Utilizzato per chiamare metodi statici (classe): ClassName::methodName() e per designare valori letterali di enumerazione, come NoYes::Yes.
; Termina le istruzioni. Utilizzato in for loop o come separatore di parti di inizializzazione, aggiornamento e controllo del valore.
< Meno di. Operatori relazionali
<< Maiusc a sinistra. Operatori aritmetici
<= Minore o uguale. Operatori aritmetici
= Operatore di assegnazione. L'argomento a sinistra di "=" è impostato sul valore dell'argomento a destra. Operatori di assegnazione
== Restituisce true se le espressioni sono uguali. Operatori relazionali
> Maggiore. Operatori relazionali
>= Maggiore o uguale. Operatori relazionali
>> Spostamento a destra bit per bit. Questo operatore sposta le punte sul lato sinistro della quantità sul lato destro. Ogni spostamento divide effettivamente il numero per 2^n, dove n è il numero di posizioni spostate. Operatori aritmetici
?: Operatore ternario. Il punto interrogativo (?) viene utilizzato anche dall'operatore like per indicare esattamente un carattere di qualsiasi tipo. L'operatore like utilizza anche il carattere. Operatore ternario (?)
[ Dichiaratore di matrice, aperto. Deve essere utilizzato con "]".
] Dichiaratore di matrice, chiudere. Deve essere utilizzato con "[".
{ Avvia un'istruzione composta che a sua volta può contenere zero o più istruzioni. L'istruzione composta termina con la corrispondenza più vicina "}".
} Indica la fine dell'istruzione composta descritta in precedenza. Un "{" deve apparire prima della prima di queste istruzioni.
astratto Modificatore di classe e metodo. Una classe astratta non può essere costruita con la parola chiave new : solo le classi da essa derivate possono. Non è possibile chiamare un metodo astratto , ma solo i metodi che ne eseguono l'override possono. Una tabella può essere modificata come astratta impostando la relativa proprietà Abstract su Yes nell'AOT o utilizzando la DictTable classe. Per impostazione predefinita, la proprietà Abstract è No e non può essere impostata a meno che la tabella non venga estesa da un'altra tabella. Ogni riga di una tabella astratta deve avere una riga dipendente in una tabella derivata. Ciò significa che ogni riga di una tabella astratta ha un valore maggiore di zero nel campo della proprietà InstanceRelationType . Non ci sono altri effetti nel contrassegnare una tabella come astratta. In modo informale, i programmatori usano spesso il termine concreto per descrivere una classe che non è astratta. Cenni preliminari sull'ereditarietà delle tabelle dei modificatori di metodo
qualsiasi tipo Un tipo che può contenere valori di qualsiasi tipo. Qualsiasi tipo
come Necessario quando si assegna una variabile di classe base a una variabile di classe derivata. Ad esempio, data una Derived classe che estende una Base classe, l'istruzione myDerived = myBase as Derived; evita un errore del compilatore utilizzando la parola chiave as . Questa parola chiave si applica anche quando si assegna una variabile di tabella di base a una variabile di tabella derivata. Se il valore (myBase) non è del tipo designato (Derived), l'espressione restituisce null. Operatori di espressione: is e as per l'ereditarietà
Asc Un'opzione sulla clausola or orderin un'istruzione bygroupby.select L'ordinamento è crescente. Sintassi dell'istruzione Select
a Specifica la posizione di una finestra di stampa come parte di un'istruzione print . L'istruzione print non deve essere utilizzata. Stampa estratti conto
medio Restituisce la media dei campi delle righe specificate dalla clausola in un'istruzione group byselect . Sintassi dell'istruzione Select
rompere Uscita immediata da un blocco di codice iterativo. Istruzioni di interruzione
Interruzione Rappresenta un punto di interruzione impostato a scopo di debug. Per impostare un punto di interruzione nel codice, scrivere: breakpoint;
presso Parte di un termine riservato, ad esempio raggruppa per e ordina per.
byref Specifica che il parametro passato al metodo chiamato viene passato per riferimento (indirizzo), anziché per valore. Byref viene utilizzato in X++ quando si chiama un metodo .NET che accetta un parametro per riferimento (ad esempio con le parole chiave C# out o ref). Procedura: utilizzare la parola chiave byref per l'interoperabilità con CLR.
caso Selezione all'interno di un'affermazione switch . Istruzioni switch
prendere Utilizzato nella gestione delle eccezioni. Gestione delle eccezioni con le parole chiave try e catch
cambiareAzienda Modifica le impostazioni del database in un'altra società. Cambia il modello di progettazione dell'azienda
classe Dichiara una classe. Classi in X++
cliente Modificatore di metodo. Questi modificatori non vengono più utilizzati. Tutti i metodi vengono eseguiti a livello server. Modificatori di metodo
contenitore Designa il container tipo. I contenitori contengono una sequenza di valori atomici e altri contenitori. Contenitori
continuare Forza l'iterazione successiva di un ciclo. Continua le dichiarazioni
contare Restituisce il numero di record dalle righe specificate dalla clausola in un'istruzione group byselect . Sintassi dell'istruzione Select
crossCompany Fa in modo che un'istruzione select restituisca i dati per tutte le società da cui l'utente è autorizzato a leggere. Nozioni di base sul codice X++ interaziendale
dattero Specifica una variabile di tipo date. Date
default Maiuscole e minuscole predefinite all'interno switch delle istruzioni. Il blocco di codice nella parte predefinita viene eseguito se il valore dell'opzione non corrisponde a nessuna delle case clausole fornite nell'istruzione switch . Istruzioni switch
delegato Membro della classe in grado di archiviare più riferimenti a metodi in altre classi e di chiamare tutti questi metodi quando richiesto. Un delegato può archiviare riferimenti a vari tipi di metodi, tra cui:
  • metodi statici nelle classi X++
  • metodi di istanza nelle classi X++
  • metodi nelle classi .NET Framework
Terminologia e parole chiave degli eventi Confronto tra X++ e C#: evento
delete_from Consente di eliminare i record dal database. delete_from
Desc Un'opzione sulla clausola or order by in un'istruzione group byselect. L'ordinamento è decrescente. Sintassi dell'istruzione Select
esporre Modificatore di metodo. Un metodo display</display> viene utilizzato per visualizzare i valori calcolati in un controllo modulo. A differenza dei campi normali, questi valori non vengono memorizzati nel database, ma vengono calcolati in modo dinamico. Modificatori di metodo
Div Divisione intera. Operatori aritmetici
fare Inizio di un do...while ciclo. Fare... mentre Loops
redigere Modificatore di metodo. Un edit metodo in X++ consente agli utenti di modificare i valori in un controllo modulo durante l'esecuzione della logica personalizzata. A differenza dei display metodi, che mostrano solo i valori calcolati, i metodi di modifica consentono sia la visualizzazione che la modifica. Modificatori di metodo
altro Esecuzione condizionale (if...else). La else parte dell'istruzione if viene eseguita se l'espressione nell'istruzione if viene valutata come false se e se ... else Dichiarazioni
eventHandler Deve essere utilizzato ogni volta che si aggiunge o si elimina un riferimento a un metodo da un delegato utilizzando l'operatore += or -= . Ad esempio: myDelegate += eventHandler(OtherClass::myStaticMethod); Terminologia e parole chiave degli eventi Confronto tra X++ e C#: evento
Esiste Utilizzato con join le clausole nelle select istruzioni. Sintassi dell'istruzione Select
Si estende Clausola di dichiarazione di classe o di interfaccia. Se la classe non estende esplicitamente un'altra classe, si considera che la classe estenda la Object classe (come se fosse stato scritto "extends Object"). Creazione di una sottoclasse
falso Valore letterale booleano. Booleani
finale Modificatore di classe e metodo. Specifica che non è possibile eseguire l'override di questo metodo. Modificatori di metodo
primoVeloce Utilizzato nelle select istruzioni per velocizzare il recupero della prima riga. Sintassi dell'istruzione Select
firstOnly Utilizzato nelle select istruzioni per recuperare solo il primo record. La firstOnly parola chiave non garantisce che un massimo di un record venga recuperato da un'istruzione SQL select X++. Se l'AOS è in grado di utilizzare la EntireTable cache per soddisfare le richieste di dati dell'istruzione select , la firstOnly parola chiave viene ignorata. Sintassi dell'istruzione Select Memorizzazione nella cache basata su set
firstOnly10 Uguale a firstOnly, tranne per il fatto che restituisce 10 righe invece di una.
firstOnly100 Uguale a firstOnly, tranne per il fatto che restituisce 100 righe anziché una.
firstOnly1000 Uguale a firstOnly, tranne per il fatto che restituisce 1.000 righe anziché una.
sciacquone Cancella l'intera cache delle tabelle. Ciò può essere utile quando si desidera assicurarsi che le modifiche apportate alla tabella vengano immediatamente riflesse nelle operazioni successive. Caching basato su set
per Per l'iterazione del ciclo. Cicli for
forzaValori letterali Utilizzato nelle select istruzioni per rivelare i valori effettivi utilizzati nelle where clausole nel database di Microsoft SQL Server al momento dell'ottimizzazione. Sintassi dell'istruzione Select
forceNestedLoop Impone al database di SQL Server di utilizzare un algoritmo a ciclo nidificato per elaborare una particolare istruzione SQL contenente un file .join Sintassi dell'istruzione Select
forceSegnaposto Utilizzato nelle select istruzioni per indicare al kernel di non rivelare i valori effettivi utilizzati nelle where clausole al database Microsoft SQL Server al momento dell'ottimizzazione. Sintassi dell'istruzione Select
forceSelectOrder Impone al database di SQL Server di accedere alle tabelle in un join nell'ordine specificato. Sintassi dell'istruzione Select
perAggiornamento Seleziona i record esclusivamente per l'aggiornamento. L'operazione da eseguire sui record recuperati è un aggiornamento. A seconda del database sottostante, i record potrebbero essere bloccati per altri utenti. Sintassi dell'istruzione Select
Da Parte di una select dichiarazione. La from clausola specifica il buffer della tabella in cui sono presenti le colonne. Sintassi dell'istruzione Select
gruppo Parte della group by clausola in una select dichiarazione. Sintassi dell'istruzione Select
se Esecuzione condizionale. se e se ... else Dichiarazioni
utensileria Implementazione di un interfacefile . Panoramica delle interfacce
insert_recordset Copia i dati da una o più tabelle in una tabella di destinazione risultante in un singolo percorso del server. insert_recordset
Int Specifica una variabile di tipo integer (32 bit). Numeri interi
int64 Specifica una variabile di tipo integer (64 bit). Numeri interi
interfaccia Dichiarazione di interfaccia. Panoramica delle interfacce
è Chiede se l'oggetto a cui fa riferimento una variabile di classe eredita dalla classe specificata o appartiene alla classe specificata. Ad esempio, data una Derived classe che estende una Base classe, l'espressione (myDerived is Base) restituisce true. Questa parola chiave si applica all'ereditarietà delle classi e delle tabelle. Operatori di espressione: is e as per l'ereditarietà
unire Le tabelle vengono unite in join su colonne comuni a entrambe le tabelle. È possibile generare un singolo set di risultati basato su più tabelle utilizzando i join. Sintassi dell'istruzione Select
come Verifica le corrispondenze in base al modello, con i simboli jolly '*' e '?'. Operatori relazionali
maxof Restituisce il numero massimo di campi delle righe specificate dalla group by clausola. Sintassi dell'istruzione Select
minof Restituisce il numero minimo di campi delle righe specificate dalla group by clausola. Sintassi dell'istruzione Select
Mod Restituisce il resto intero di left expression1 diviso per right expression2. In modo informale, questo è talvolta chiamato operatore modulo. (12 mod 7) == 5 è vero.
Nuovo Operatore. Crea un'istanza di una classe o alloca memoria per una matrice.
prossimo Recupera il record successivo in una tabella o chiama il metodo successivo in una sequenza di catena di comandi.
noFetch Indica che non è necessario recuperare alcun record. Sintassi dell'istruzione Select
notExists Utilizzato con join le clausole nelle select istruzioni. Sintassi dell'istruzione Select
nullo Costante simbolica.
optimisticLock Forza l'esecuzione di un'istruzione con il controllo della concorrenza ottimistica, anche se nella tabella è impostato un valore diverso. Sintassi dell'istruzione Select
ordine Parte della order by clausola in una select dichiarazione. Sintassi dell'istruzione Select
esterno giunto esterno. Sintassi dell'istruzione Select
pausa Interrompe l'esecuzione di un processo. All'utente viene chiesto di indicare se l'esecuzione deve continuare. Non è consigliabile utilizzare questa istruzione nel codice di produzione. Seleziona estratti conto
pessimisticLock Forza l'esecuzione di un'istruzione con il controllo della concorrenza pessimistica, anche se nella tabella è impostato un valore diverso. Sintassi dell'istruzione Select
Stampare Consente di visualizzare l'output sullo schermo. Non è consigliabile utilizzare questa istruzione nel codice di produzione. Stampa estratti conto
privato Modificatore di accesso al metodo. Il metodo può essere utilizzato solo all'interno della classe che lo dichiara. Metodo Controllo Accessi
protetto Modificatore di accesso al metodo. Il metodo può essere utilizzato dai metodi nella classe che dichiara i metodi e in qualsiasi classe derivata. Metodo Controllo Accessi
pubblico Modificatore di accesso al metodo. Il metodo può essere chiamato da qualsiasi classe. Metodo Controllo Accessi
reale Designa il real tipo, un tipo decimale senza errori di arrotondamento. Reali
ripetibileLeggi Specifica che nessun'altra transazione può modificare i dati che sono stati letti dalla logica all'interno della transazione corrente, fino al completamento della transazione corrente. Una transazione esplicita viene completata in corrispondenza di ttsAbort o del più esterno ttsCommit. Per un'istruzione select autonoma, la durata della transazione è la durata del comando select . Tuttavia, il database a volte applica l'equivalente di repeatableRead nelle singole istruzioni select anche senza che questa parola chiave venga visualizzata nel codice X++ (a seconda di come il database decide di analizzare le tabelle). Per ulteriori informazioni, vedere la documentazione relativa al prodotto di database relazionale sottostante.
ripetere Utilizzato nella gestione delle eccezioni. Gestione delle eccezioni con le parole chiave try e catch
ritorno Restituisce da un metodo. Dichiarazione dei metodi
inverso I record vengono restituiti in ordine inverso. Sintassi dell'istruzione Select
selezionare La select clausola indica le colonne o le viste visualizzate nel set di risultati. Seleziona estratti conto
server Modificatore di metodo. Questo modificatore viene ignorato e non deve essere utilizzato, poiché tutti i metodi vengono eseguiti sul lato server. Modificatori di metodo
impostazione Utilizzato con il comando update_recordset . update_recordset
statico I metodi statici non possono fare riferimento a variabili di istanza (solo a variabili statiche); può essere invocato utilizzando il nome della classe anziché su un'istanza della classe ("MyClass.aStaticProcedure"). Modificatori di metodo
Str Designa il string tipo. Stringhe
somma Restituisce la somma dei campi delle righe specificate dalla clausola in un'istruzione group byselect . Sintassi dell'istruzione Select
super Chiama il metodo di cui è stato eseguito l'override dal metodo corrente. Metodi di tabella
interruttore Istruzione Switch. Istruzioni switch
tableLock Obsoleto; tableLock non è più disponibile.
questo Riferimento all'istanza corrente della classe. Utilizzato nel codice X++ all'interno di un metodo di istanza della classe. Utilizzato per fare riferimento ai membri del metodo della classe.
gettare Utilizzato nella gestione delle eccezioni. Gestione delle eccezioni con le parole chiave try e catch
vero Valore letterale booleano. Booleani
provare Utilizzato nella gestione delle eccezioni. Gestione delle eccezioni con le parole chiave try e catch
ttsAbort Annulla (cioè scarta) tutte le modifiche apportate alla transazione corrente. Integrità delle transazioni
ttsInizio Segna l'inizio di una transazione. Integrità delle transazioni
ttsCommit Contrassegna la fine di una transazione, eseguendo il commit delle modifiche apportate alle tabelle. Integrità delle transazioni
update_recordset Consente la manipolazione di set di righe all'interno di un'unica operazione. update_recordset
validTimeState Filtra le righe recuperate da una tabella dello stato dell'ora valida tramite un'istruzione SQL select X++. Ad esempio: seleziona validTimeState(myDateEffective) * da xMyTable; ... o... selezionare validTimeState(myDateFrom, myDateTo) * da xMyTable; Effetti delle tabelle di stato dell'ora valide sulle operazioni di lettura e scrittura
vuoto Identifica un metodo che non restituisce un valore. Dichiarazione dei metodi
dove Parte di una select dichiarazione. La where clausola specifica le condizioni da soddisfare, ovvero le righe che si desidera includere nel risultato. Sintassi dell'istruzione Select
mentre Istruzione di iterazione. Esegue ripetutamente un'istruzione, purché la condizione di test sia vera. While esegue il ciclo while select Statements
finestra Consente di modificare le dimensioni della finestra di output. Usato con istruzioni print</print> non consigliate nel codice di produzione. Stampa estratti conto

Sintassi delle espressioni

Un'espressione in X++ viene utilizzata in modo matematico o logico. Le espressioni sono costruite sui tipi di dati del linguaggio; In altre parole, un'espressione restituisce sempre un valore di un certo tipo. Questo valore può essere utilizzato in calcoli, assegnazioni, istruzioni condizionali e così via.

EBNF Descrizione delle espressioni in X++

Termine   Definizione
Espressione = Espressione semplice [Espressione semplice di operatore relazionale]
Operatore relazionale = =
Espressione semplice = Espressione semplice [ +
Termine = Compfactor { Multi-operatore CompFactor }
Operatore di mult = *
Fattore comp = [ ! ] [ -
Fattore = Letterale
Enumerazione = EnumName :: Letterale
Variabile = Identificatore [ [ Espressione ] ] [ . Espressione ]
Chiamata di funzione = [ Espressione (.
Espressione if = Espressione? Espressione : Espressione

Le restrizioni semantiche si applicano alla sintassi precedente. Non è possibile chiamare alcun metodo utilizzando l'operatore ::. Allo stesso modo, non è possibile utilizzare la parola chiave this senza un oggetto attivo; ovvero, se non ci si trova all'interno di un metodo di istanza e così via.

Esempi

Esempio di espressione Descrizione
1 Un valore letterale intero.
NoSì::No Un riferimento enum.
A Un riferimento variabile.
Debitore::Trova("1") Una chiamata al metodo statica (restituisce una variabile cliente).
(A > 3 ? vero : falso) Un'espressione if che restituisce true o false.
(selezionare CustTable dove CustTable.Account == "100"). NomeRef Un'espressione di selezione. Restituisce il campo nameref nella tabella customer. Si tratta di una stringa.
A >= B Un'espressione logica. Restituisce true o false.
A + B Un'espressione aritmetica. Somme A e B.
A + B / C Calcola B/C e quindi lo aggiunge ad A.
~A + questo. Valore() Somma il file binario non A e il risultato della chiamata al metodo Value sull'oggetto nell'ambito (this).
Debitore::Trova("1"). NomeRef Restituisce il campo NameRef del record del cliente trovato.
Debitore::Trova("1"). Equilibrio() Una chiamata al metodo a Balance nella tabella dei clienti (Debtor::Find restituisce un cliente). Restituisce il saldo del cliente con numero di conto 1.

Panoramica di EBNF

Extended Backus Naur Form (EBNF) è un metalinguaggio e viene utilizzato in questa guida per descrivere la sintassi del linguaggio. Una definizione EBNF è costituita da regole di produzione, non terminali e terminali. I termini chiave sono illustrati nella tabella seguente.

Termini chiave Esempio Descrizione
Terminali Work_Team Un terminale è un carattere o una stringa di caratteri che non cambia mai.
Non terminali Employee Un non terminale è una descrizione di una parte di una frase valida nella lingua che è definita da una regola di produzione o da una descrizione testuale. Un simbolo non terminale può sempre essere espanso in uno o più simboli terminali.
Regole di produzione Dipendente = Sviluppatore Tester

Esempio

Work_Team = Manager Dipendente {, Dipendente} Dipendente = Sviluppatore | Tester In questo esempio viene definito un Work_Team come costituito da a Manager e uno o più Employees. An Employee è definito come un Developer, o un Tester. I simboli utilizzati nell'esempio sono descritti nella tabella seguente.

Simboli speciali in EBNF

Simbolo Descrizione
(Espressione) Le parentesi tengono insieme i simboli (terminali e non terminali). Possono essere posizionati in qualsiasi punto del lato destro di una regola di produzione.
Espressione1 Espressione2
[Espressione] Facoltativo: gli elementi compresi tra [ e ] sono facoltativi. Sono inclusi tutti o nessuno degli elementi tra parentesi.
{Espressione} Ripeti: gli elementi compresi tra { e } sono facoltativi, ma possono essere ripetuti tutte le volte che è necessario.

Ad esempio, se gli accessori che acquisti per la tua bicicletta consistono in una sella, portaborraccia, campanelli e clacson, e potresti avere una campana o un clacson, e zero, uno o più portaborraccia ed esattamente una sella, questo potrebbe essere espresso come: Bicycle_Accessories = sella [campanello | corno] {water_bottle_holders} Questa grammatica definisce le seguenti possibilità: saddlesaddle bellsaddle horn sella water_bottle_holder campana della sella water_bottle_holder campana della sella water_bottle_holder water_bottle_holder E così via.

Grammatica X++

Questo articolo illustra la grammatica formale del linguaggio X++.

Come interpretare la grammatica formale BNF

In questa sezione viene descritta la grammatica di X++ in Backus Naur Form (BNF). Un piccolo esempio di BNF è descritto qui.

AA ::= BB  CC_SYM
BB ::= JJ_SYM
   ::= KK_SYM

AA è il nome di una regola di produzione. An AA richiede un BB, seguito da un CC_SYM. A BB è anche una regola di produzione. Pertanto, BB non è un terminale. BB deve essere un JJ_SYM o un KK_SYM. Sia JJ_SYM che KK_SYM sono terminali perché non sono i nomi di altre regole di produzione. CC_SYM è anche un terminal.

Nella grammatica BNF per X++, la maggior parte dei terminali ha _SYM come suffisso del loro nome.

Grammatica formale X++ in BNF

Questa sezione contiene il BNF che definisce la grammatica di 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

Risorse aggiuntive

Guida di riferimento al linguaggio X++