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:

   GlobalIdentifier:
     [@ Identifier]

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:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

è una sintassi abbreviata per:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

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:one of
    0123456789

è una sintassi abbreviata per:

   DecimalDigit:
    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.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     Whitespace
     Comment

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.

   Whitespace:
    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.

   Comment:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    qualsiasi carattere Unicode tranne NewLineCharacter

   DelimitedComment:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentCharactersNoAsterisk:
    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.

   Literal:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Valori letterali logici

Per scrivere i valori true e false viene usato un valore letterale logico, che produce un valore logico.

   LogicalLiteral:one of
    truefalse

Valori letterali numerici

Per scrivere un valore numerico viene usato un valore letterale numerico, che produce un valore numerico.

   NumberLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:one of
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:one of
    eE

   Sign:one of
    +-

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

   TextLiteral:
     " TextLiteralCharactersopt"

   TextLiteralCharacters:
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter:
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   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.

   Identifier:
     IdentifierName ma non Operator o ContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetterCharacter:
    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)

   CombiningCharacter:
    qualsiasi carattere Unicode della classe Segno senza spaziatura (Mn) o Segno di combinazione spaziatura (Mc)

   DecimalDigitCharacter:
    qualsiasi carattere Unicode della classe Cifra decimale (Nd)

   ConnectingCharacter:
    qualsiasi carattere Unicode della classe Punteggiatura connettore (Pc)

   FormattingCharacter:
    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.

   SingleQuotedIdentifier:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    qualsiasi carattere Unicode ad eccezione di ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Identificatore disambiguato

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifier[@Identifier]

   GlobalIdentifier:
     [@ Identifier]

Parole chiave del contesto

   ContextKeyword:
    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

   DecimalSeparator:
     . (punto) per le lingue che utilizzano un punto come separatore per i numeri decimali, ad esempio 1.23
     , (virgola) per le lingue che utilizzano una virgola come separatore per i numeri decimali, ad esempio 1,23

   ListSeparator:
     , (virgola) se DecimalSeparator è . (punto)
     ; (punto e virgola) se DecimalSeparator è , (virgola)

   ChainingSeparator:
     ;(punto e virgola) se DecimalSeparator è . (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.

   Operator:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

   BinaryOperator:one of
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Whitespace
     Or Whitespace

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Whitespace

   PostfixOperator:
    %

Operatore di riferimento

   ReferenceOperator:one of
    .!

Riferimento a un oggetto

   Reference:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identifier
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList:
     Identifier
     IdentifierReferenceOperatorReferenceList

Record in linea

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Tabella in linea

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expression
     ExpressionListSeparatorInlineTableList

Expression

   Expression:
     Literal
     Reference
     InlineRecord
     InlineTable
     FunctionCall
     ( Expression)
     PrefixOperatorExpression
     ExpressionPostfixOperator
     ExpressionBinaryOperatorExpression

Espressioni concatenate

   ChainedExpression:
     Expression
     ExpressionChainingSeparatorChainedExpressionopt

Chiamata funzione

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identifier
     Identifier.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments