Grammatica delle espressioni
Nota
Microsoft Power Fx è il nuovo nome per il linguaggio delle formule per le app canvas. Questi articoli sono in fase di elaborazione poiché estraiamo il linguaggio dalle app canvas, lo integriamo con altri prodotti di Microsoft Power Platform e lo rendiamo disponibile come open source. Inizia con la panoramica di Microsoft Power Fx per un'introduzione al linguaggio.
Microsoft Power Fx si basa su formule che associano un nome a un'espressione. Proprio come nei fogli di lavoro di Excel, quando le dipendenze in ingresso all'espressione cambiano, l'espressione viene ricalcolata e il valore del nome cambia, possibilmente propagando a catena il ricalcolo in altre formule.
Questa grammatica copre la parte dell'espressione della formula. L'associazione a un nome per creare una formula dipende da come è integrato Power Fx. Nei fogli di lavoro, la sintassi di associazione non è esposta, è implicita nella posizione in cui è scritta l'espressione, ad esempio inserendo =B1
nella cella A1. In alcuni casi, non è richiesta alcuna associazione e Power Fx viene utilizzato come analizzatore di espressioni, ad esempio per supportare le colonne calcolate di una tabella di database. Per Power Apps, l'associazione è implicita quando si lavora in Power Apps Studio con un formato di serializzazione basato su YAML per l'uso al di fuori di Power Apps Studio.
Convenzioni grammaticali
Le grammatiche lessicali e sintattiche vengono presentate usando produzioni grammaticali. Ogni produzione grammaticale definisce un simbolo non terminale e le possibili espansioni di quel simbolo non terminale, in sequenze di simboli terminali o non terminali. Nelle produzioni grammaticali, i simboli non terminali vengono visualizzati in corsivo e i simboli terminal in un tipo di carattere a larghezza fissa.
La prima riga di una produzione grammaticale corrisponde al nome del simbolo non terminale definito, seguito da due punti. Ogni successiva riga rientrata contiene una possibile espansione del simbolo non terminale, specificata come sequenza di simboli terminali o non terminali. Ad esempio, la produzione:
IdentificatoreGlobale:
[@
Identificatore]
definisce un GlobalIdentifier per farlo consistere nel token [@
, seguito da un Identificatore, seguito dal token ]
.
Se esiste più di un'espansione possibile per un simbolo non terminale, le alternative vengono elencate in righe separate. Per indicare un simbolo facoltativo, viene usato il pedice "opt". Ad esempio, la produzione:
Chiamata di funzione:
IdentificatoreFunzione(
ArgomentiFunzioneopt)
è una sintassi abbreviata per:
Chiamata di funzione:
Identificatore di funzione(
)
FunctionIdentifier(
ArgomentiFunzione)
Le alternative, in genere, sono elencate in righe separate ma, nel caso in cui esistano molte alternative, la frase "uno di" può precedere un elenco di espansioni in una singola riga. Si tratta semplicemente di una sintassi abbreviata per elencare ognuna delle alternative in righe separate.
Ad esempio, la produzione:
DecimalDigit:uno dei
0
1
2
3
4
5
6
7
8
9
è una sintassi abbreviata per:
CifraDecimale:
0
1
2
3
4
5
6
7
8
9
Analisi lessicale
La produzione di unità lessicali definisce la grammatica lessicale per un'espressione Power Fx. Ogni espressione Power Fx valida è conforme a questa grammatica.
Unità di espressione:
ExpressionElementsopt
Elementi di espressione:
Elemento di espressione
ExpressionElementElementi di espressioneopt
ElementoEspressione:
Spazio vuoto
Commento
A livello lessicale, un'espressione Power Fx è costituita da un flusso di elementi Whitespace, Comment e Token. Ciascuna di queste produzioni viene trattata nelle sezioni seguenti. Nella grammatica sintattica solo gli elementi Token sono significativi.
Spazio vuoto
In un documento Power Apps, per separare commenti e token viene usato uno spazio vuoto.
Spazi vuoti:
qualsiasi separatore di spazio Unicode (classe Zs)
qualsiasi separatore di riga Unicode (classe Zl)
qualsiasi separatore di paragrafo Unicode (classe Zp)
Carattere di tabulazione orizzontale (U+0009)
Carattere di avanzamento riga (U+000A)
Carattere di tabulazione verticale (U+000B)
Carattere di avanzamento carta (U+000C)
Carattere di ritorno a capo (U+000D)
Carattere di nuova riga (U+0085)
Commenti
Sono supportate due forme di commenti:
- I commenti su riga singola che iniziano con i caratteri
//
e si estendono fino alla fine della riga di origine. - I commenti delimitati che iniziano con i caratteri
/*
e terminano con i caratteri*/
. I commenti delimitati possono estendersi su più righe.
Commento:
Commento delimitato
Commento a riga singola
SingleLineComment:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterCaratteriSingleLineCommentopt
SingleLineCommentCharacter:
qualsiasi carattere Unicode tranne NewLineCharacter
Commento delimitato:
/*
CaratteriCommentoDelimitatiopt*/
CaratteriCommentoDelimitati:
CaratteriCommentoDelimitatiNessunAsteriscoCaratteriCommentoDelimitatiopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
CaratteriCommentoDelimitatiNessunAsterisco:
qualsiasi carattere Unicode ad eccezione di * (asterisco)
DelimitedCommentNoSlashAsteriskCharacter:
qualsiasi carattere Unicode ad eccezione di / (barra) o * (asterisco)
I commenti non sono nidificati. Le sequenze di caratteri /*
e */
non hanno un significato speciale in un commento su riga singola, così come le sequenze di caratteri //
e /*
non hanno un significato speciale in un commento delimitato.
I commenti non vengono elaborati all'interno di stringhe letterali di testo.
L'esempio seguente include due commenti delimitati:
/* Hello, world
*/
"Hello, world" /* This is an example of a text literal */
I seguenti esempi includono tre commenti su una sola riga:
// Hello, world
//
"Hello, world" // This is an example of a text literal
Letterali
Un valore letterale è una rappresentazione del codice sorgente di un valore.
Letterale:
LogicoLetterale
NumeroLetterale
TestoLetterale
Valori letterali logici
Per scrivere i valori true e false viene usato un valore letterale logico, che produce un valore logico.
LogicalLiteral:uno di
true
false
Valori letterali numerici
Per scrivere un valore numerico viene usato un valore letterale numerico, che produce un valore numerico.
NumeroLetterale:
Cifre decimaliParte esponenteopt
Cifre decimaliSeparatore decimaleCifre decimalioptParte esponenteopt
Separatore decimaleCifre decimaliParte esponenteopt
Cifre decimali:
Cifra decimale
CifreDecimaliCifraDecimale
DecimalDigit:uno dei
0
1
2
3
4
5
6
7
8
9
ParteEsponente:
ExponentIndicatorSegnooptCifre decimali
Indicatore esponente:uno di
e
E
Valori letterali di testo
Per scrivere una sequenza di caratteri Unicode viene usato un valore letterale di testo, che produce un valore di testo. I valori letterali di testo sono racchiusi tra virgolette doppie. Per includere virgolette doppie nel valore del testo, ripeti le virgolette doppie, come mostrato nell'esempio seguente:
"The ""quoted"" text" // The "quoted" text
TestoLetterale:
"
CaratteriTestoLetteraliopt"
CaratteriTestoLetterali:
TextLiteralCharacterTextLiteralCharacteropt
CarattereTestoLetterale:
TestoCarattereNoDoubleQuote
DoppiaCitazioneEscapeSequence
TextCharacterNoDoubleQuote:
qualsiasi punto di codice Unicode tranne le virgolette doppie
DoubleQuoteEscapeSequence:
"
"
Identifiers
Con il termine identificatore si fa riferimento a un valore. Gli identificatori possono essere regolari o a virgolette singole.
Identificatore:
IdentifierNamemanonoperatoreoParola chiave di contesto
IdentificatoreNome:
IdentificatoreInizioCarattereIdentificatoreContinuaCaratteriopt
'
Identificatore con virgolette singole'
IdentificatoreInizioCarattere:
LetteraCarattere
_
IdentificatoreContinuaCarattere:
IdentificatoreStartCharacter
CarattereCifraDecimale
CollegamentoCarattere
Combinazione di caratteri
FormattazioneCarattere
IdentificatoreContinuaCaratteri:
IdentificatoreContinuaCarattereIdentificatoreContinuaCaratteriopt
LetteraCarattere:
qualsiasi carattere Unicode della classe Lettera maiuscola (Lu) o Lettera minuscola (Ll)
qualsiasi carattere Unicode della classe Lettera iniziale maiuscola (Lt)
qualsiasi carattere Unicode della classe Lettera modificatore (Lm) o Lettera altro (Lo)
qualsiasi carattere Unicode della classe Lettera numero (NI)
Combinazione di caratteri:
qualsiasi carattere Unicode della classe Segno senza spaziatura (Mn) o Segno di combinazione spaziatura (Mc)
CarattereCifraDecimale:
qualsiasi carattere Unicode della classe Cifra decimale (Nd)
CollegamentoCarattere:
qualsiasi carattere Unicode della classe Punteggiatura connettore (Pc)
FormattazioneCarattere:
qualsiasi carattere Unicode della classe Formato (Cf)
Identificatori con virgolette singole
Un identificatore con virgolette singole può contenere qualsiasi sequenza di caratteri Unicode da usare come identificatore, tra cui parole chiave, spazi vuoti, commenti e operatori. I caratteri delle virgolette singole sono supportati con una sequenza di escape di due virgolette singole.
Identificatore con virgolette singole:
Caratteri SingleQuotedIdentifier
CaratteriIdentificativi con Citazione Singola:
SingleQuotedIdentifierCharacterCaratteri SingleQuotedIdentifieropt
CarattereIdentificativo con Citazione Singola:
TestoCaratteriNessunaCitazioneSingola
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
qualsiasi carattere Unicode ad eccezione di ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Identificatore disambiguato
Identificatore non ambiguo:
Identificatore colonna tabella
Identificatore Globale
IdentificatoreColonnaTabella:
Identificatore[@
Identificatore]
IdentificatoreGlobale:
[@
Identificatore]
Parole chiave del contesto
ContestoParola chiave:
Parent
Self
ThisItem
ThisRecord
Distinzione tra maiuscole e minuscole
Gli identificatori di Power Apps sono sensibili al maiuscolo/minuscolo. Lo strumento di creazione li modificherà automaticamente nel formato corretto quando viene scritta una formula.
Separatori
Separatore decimale:
.
(punto) per le lingue che usano un punto come separatore per i numeri decimali, ad esempio 1.23
,
(virgola) per le lingue che usano la virgola come separatore per i numeri decimali, ad esempio 1,23
Separatore di elenco:
,
(virgola) se DecimalSeparator è .
(punto)
;
(punto e virgola) se SeparatoreDecimale è ,
(virgola)
Separatore di concatenamento:
;
(punto e virgola) se SeparatoreDecimale è .
(punto)
;;
(doppio punto e virgola) se DecimalSeparator è ,
(virgola)
Operatori
Gli operatori vengono usati nelle formule per descrivere le operazioni che includono uno o più operandi. L'espressione a + b
, ad esempio, usa l'operatore +
per aggiungere i due operandi a
e b
.
operatore:
Operatore binario
BinaryOperatorRichiedeSpaziBianchi
PrefissoOperatore
PrefissoOperatoreRichiedeSpazi
Operatore Postfix
BinaryOperator:uno dei
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Spazio vuoto
Or
Spazio vuoto
PrefixOperatorRequiresWhitespace:
Not
Spazio vuoto
Operatore di riferimento
Riferimento a un oggetto
Riferimento:
Riferimento di base
RiferimentoBaseOperatoreRiferimentoElencoRiferimenti
Riferimento di base:
Identificatore
Identificatore disambiguato
ContestoParola chiave
Elenco di riferimento:
Identificatore
IdentificatoreOperatore di riferimentoElenco di riferimento
Record in linea
Registrazione in linea:
{
InlineRecordListopt}
Elenco record in linea:
Identificatore:
Espressione
Identificatore:
EspressioneListSeparatorInlineRecordList
Tabella in linea
Tabella in linea:
[
InlineTableListopt]
ElencoTableInline:
Espressione
EspressioneSeparatore di elencoInlineTableList
Expression
Espressione:
Letterale
Riferimento
Registrazione in linea
Tabella in linea
FunzioneChiamata
(
Espressione)
PrefixOperatorEspressione
EspressioneOperatorePostfix
EspressioneOperatoreBinarioEspressione
Espressioni concatenate
Espressione concatenata:
Espressione
EspressioneSeparatore di concatenamentoEspressione concatenataopt
Chiamata funzione
FunzioneChiamata:
IdentificatoreFunzione(
ArgomentiFunzioneopt)
Identificatore di funzione:
Identificatore
Identificatore.
Identificatore di funzione
Argomenti della funzione:
Espressione incatenata
Espressione concatenataSeparatore di elencoArgomenti di funzione