Condividi tramite


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
    0123456789

è 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
    truefalse

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
    0123456789

  ParteEsponente:
    ExponentIndicatorSegnooptCifre decimali

  Indicatore esponente:uno di
    eE

  Segno:uno dei
    +-

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
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

  BinaryOperatorRequiresWhitespace:
    AndSpazio vuoto
    OrSpazio vuoto

  PrefissoOperatore:
    !

  PrefixOperatorRequiresWhitespace:
    NotSpazio vuoto

  Operatore Postfix:
    %

Operatore di riferimento

  ReferenceOperator:uno dei
    .!

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