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

  PrefixOperator :
    !

  PrefixOperatorRequiresWhitespace :
    NotWhitespace

  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