Partager via


Grammaire des expressions

Note

Microsoft Power Fx est le nouveau nom du langage de formule pour les applications de canevas. Ces articles associés sont un travail en cours car nous extrayons le langage des applications de canevas, l’intégrons à d’autres produits Microsoft Power Platform, et le rendons disponible en open source. Commencez par l’Aperçu de Microsoft Power Fx pour une introduction à la langue.

Microsoft Power Fx est basé sur des formules qui lient un nom à une expression. Tout comme dans les feuilles de calcul Excel, à mesure que les dépendances entrantes à l’expression changent, l’expression est recalculée et la valeur du nom change, ce qui peut entraîner le recalcul dans d’autres formules.

Cette grammaire couvre la partie expression de la formule. La liaison à un nom pour créer une formule dépend de la façon dont Power Fx est intégré. Dans les feuilles de calcul, la syntaxe de liaison n’est pas exposée, elle est impliquée par l’emplacement où l’expression est écrite, par exemple, en entrant =B1 dans la cellule A1. Dans certains cas, aucune liaison n’est requise du tout et Power Fx est utilisé comme évaluateur d’expression, par exemple pour prendre en charge les colonnes calculées d’une table de base de données. Pour Power Apps, la liaison est implicite lorsque vous travaillez dans Power Apps Studio avec un format de sérialisation basé sur YAML pour une utilisation en dehors de Power Apps Studio.

Conventions grammaticales

Les grammaires lexicales et syntaxiques sont présentées à l’aide de productions grammaticales. Chaque production grammaticale définit un symbole non terminal et les expansions possibles de ce symbole non terminal en séquences de symboles non terminaux ou terminaux. Dans les productions grammaticales, les symboles non terminaux sont affichés en italique, et les symboles terminaux sont affichés dans une police à largeur fixe.

La première ligne d’une production grammaticale est le nom du symbole non terminal en cours de définition, suivi d’un signe deux-points. Chaque ligne en retrait successive contient une expansion possible du symbole non terminal sous forme de séquence de symboles non terminaux ou terminaux. Par exemple, la production :

   GlobalIdentifier :
     [@ Identifier]

définit un GlobalIdentifier qui se compose du jeton [@, suivi d’un Identifiant, suivi du jeton ].

Quand il existe plusieurs expansions possibles d’un symbole non terminal, les alternatives sont listées sur des lignes distinctes. L’indice « opt » est utilisé pour indiquer un symbole facultatif. Par exemple, la production :

   FunctionCall :
     FunctionIdentifier(FunctionArgumentsopt)

est un raccourci de :

   FunctionCall :
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

Les alternatives sont normalement listées sur des lignes distinctes, bien que dans les cas où il existe de nombreuses alternatives, l’expression « one of » pourrait précéder une liste d’expansions donnée sur une seule ligne. Il s’agit simplement d’un raccourci pour lister chacune des alternatives sur des lignes distinctes.

Par exemple, la production :

   DecimalDigit : one of
    0123456789

est un raccourci de :

   DecimalDigit :
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Analyse lexicale

La production d’unité lexicale définit la grammaire lexicale d’une expression Power Fx. Chaque expression Power Fx valide est conforme à cette grammaire.

   ExpressionUnit :
     ExpressionElementsopt

   ExpressionElements :
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement :
     Whitespace
     Comment

Au niveau lexical, une expression Power Fx est constituée d’un flux d’éléments Espace blanc, Commentaire et Jeton. Chacune de ces productions est présentée individuellement dans les sections suivantes. Seuls les éléments Jeton sont significatifs dans la grammaire syntaxique.

Espace blanc

Les espaces blancs servent à séparer les commentaires et les jetons dans un document Power Apps.

   Whitespace :
    tout séparateur d’espace Unicode (classe Zs)
    tout séparateur de ligne Unicode (classe Zl)
    tout séparateur de paragraphe Unicode (classe Zp)
    Caractère de tabulation horizontale (U+0009)
    Caractère de saut de ligne (U+000A)
    Caractère de tabulation verticale (U+000B)
    Caractère de saut de page (U+000C)
    Caractère de retour chariot (U+000D)
    Caractère de ligne suivante (U+0085)

Commentaires

Deux formes de commentaires sont prises en charge :

  • Les commentaires sur une seule ligne commençant par les caractères // et s’étendant jusqu’à la fin de la ligne source.
  • Les commentaires délimités commençant par les caractères /* et se terminant par les caractères */. Les commentaires délimités peuvent s’étendre sur plusieurs lignes.

   Comment :
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters :
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter :
    tous les caractères Unicode sauf NewLineCharacter

   DelimitedComment :
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters :
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentAfterAsteriskCharacters :
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters

   DelimitedCommentCharactersNoAsterisk :
    Tout caractère Unicode sauf * (astérisque)

   DelimitedCommentNoSlashAsteriskCharacter :
    Tout caractère Unicode sauf / (barre oblique) ou * (astérisque)

Les commentaires ne sont pas imbriqués. Les séquences de caractères /* et */ n’ont aucune signification particulière dans un commentaire sur une seule ligne, et les séquences de caractères // et /* n’ont aucune signification particulière dans un commentaire délimité.

Les commentaires ne sont pas traités dans les chaînes littérales de texte.

L’exemple suivant comprend deux commentaires délimités :

/* Hello, world
*/
"Hello, world"    /* This is an example of a text literal */

Les exemples suivants incluent trois commentaires sur une seule ligne :

// Hello, world
//
"Hello, world"    // This is an example of a text literal

Littéraux

Un littéral est une représentation en code source d’une valeur.

   Literal :
     LogicalLiteral
     NumberLiteral
     TextLiteral

Littéraux logiques

Un littéral logique est utilisé pour écrire les valeurs true et false, et génère une valeur logique.

   LogicalLiteral :one of
    truefalse

Littéraux numériques

Un littéral numérique est utilisé pour écrire une valeur numérique, et génère une valeur numérique.

   NumberLiteral :
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits :
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit :one of
    0123456789

   ExponentPart :
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator :one of
    eE

   Sign :one of
    +-

Littéraux de texte

Un littéral de texte est utilisé pour écrire une séquence de caractères Unicode, et génère une valeur de texte. Les littéraux de texte sont placés entre guillemets doubles. Pour inclure des guillemets doubles dans la valeur de texte, répétez les guillemets doubles, comme illustré dans l’exemple suivant :

"The ""quoted"" text" // The "quoted" text

   TextLiteral :
     " TextLiteralCharactersopt"

   TextLiteralCharacters :
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter :
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   TextCharacterNoDoubleQuote :
    tout point de code Unicode sauf les guillemets doubles

   DoubleQuoteEscapeSequence :
    ""

Identifiers

Un identificateur est un nom utilisé pour faire référence à une valeur. Les identificateurs peuvent être des identificateurs réguliers ou des identificateurs entre guillemets simples.

   Identifier :
     IdentifierNamemaispasOperatorouContextKeyword

   IdentifierName :
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter :
     LetterCharacter
    _

   IdentifierContinueCharacter :
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters :
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetterCharacter :
    tout caractère Unicode de la classe Lettre majuscule (Lu) ou Lettre minuscule (Ll)
    tout caractère Unicode de la classe Casse de titre (Lt)
    tout caractère Unicode de la classe Modificateur de lettre (Lm) ou Lettre autre (Ll)
    tout caractère Unicode de la classe Lettre nombre (Nl)

   CombiningCharacter :
    tout caractère Unicode de la classe Marque sans espacement (Mn) ou Espacement combinant la marque (Mc)

   DecimalDigitCharacter :
    tout caractère Unicode de la classe Chiffre décimal (Nd)

   ConnectingCharacter :
    tout caractère Unicode de la classe Ponctuation connecteur (Pc)

   FormattingCharacter :
    tout caractère Unicode de la classe Format (Cf)

Identificateurs entre guillemets simples

Vous pouvez utiliser un identificateur avec un seul guillemet pour utiliser n’importe quelle séquence de zéro, un ou plusieurs caractères Unicode comme identificateur, y compris les mots clés, les espaces blancs, les commentaires, les signes de ponctuation et les opérateurs. Les guillemets simples sont pris en charge avec une séquence d’échappement de deux guillemets simples.

   SingleQuotedIdentifier :
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters :
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter :
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote :
    tout caractère Unicode sauf ’ (U+0027)

   SingleQuoteEscapeSequence :
    ''

Identificateur sans ambiguïté

   DisambiguatedIdentifier :
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier :
     Identifier[@Identifier]

   GlobalIdentifier :
     [@ Identifier]

Mots-clés de contexte

   ContextKeyword :
    Parent
    Self
    ThisItem
    ThisRecord

Sensibilité à la casse

Les identificateurs Power Apps sont sensibles à la casse. L’outil de création les changera automatiquement en casse correcte lorsqu’une formule est en cours d’écriture.

Séparateurs

   DecimalSeparator :
     . (point) pour les langues qui utilisent un point comme séparateur pour les nombres décimaux, par exemple 1.23
     , (virgule) pour les langues qui utilisent une virgule comme séparateur pour les nombres décimaux, par exemple 1,23

   ListSeparator :
     , (virgule) si DecimalSeparator est . (point)
     ; (point-virgule) si DecimalSeparator est , (virgule)

   ChainingSeparator :
     ; (point-virgule) si DecimalSeparator est . (point)
     ;; (point-virgule double) si DecimalSeparator est , (virgule)

Opérateurs

Les opérateurs sont utilisés dans les formules pour décrire des opérations impliquant un ou plusieurs opérandes. Par exemple, l’expression a + b utilise l’opérateur + pour ajouter les deux opérandes a et b.

   Operator :
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

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

   BinaryOperatorRequiresWhitespace :
     And Whitespace
     Or Whitespace

   PrefixOperator :
    !

   PrefixOperatorRequiresWhitespace :
     Not Whitespace

   PostfixOperator :
    %

Opérateur de référence

   ReferenceOperator :one of
    .!

Référence d’objet

   Reference :
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference :
     Identificateur
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList :
     Identificateur
     IdentifierReferenceOperatorReferenceList

Enregistrement en ligne

   InlineRecord :
     { InlineRecordListopt}

   InlineRecordList :
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Table en ligne

   InlineTable :
     [ InlineTableListopt]

   InlineTableList :
     Expression
     ExpressionListSeparatorInlineTableList

Expression

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

Expressions enchaînées

   ChainedExpression :
     Expression
     ExpressionChainingSeparatorChainedExpressionopt

Appel de fonction

   FunctionCall :
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier :
     Identificateur
     Identifier.FunctionIdentifier

   FunctionArguments :
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments