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:
    IdentifierNamemanonOperatoro 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:
    AndWhitespace
    OrWhitespace

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotWhitespace

  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