Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
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:
|
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