Delen via


Grammatica van expressies

Notitie

Microsoft Power Fx is de nieuwe naam voor de formuletaal voor canvas-apps. Aan deze artikelen wordt gewerkt terwijl we de taal extraheren uit canvas-apps en deze integreren met andere Microsoft Power Platform-producten en het beschikbaar maken als open source. Begin met het Microsoft Power Fx-overzicht voor een inleiding in de taal.

Microsoft Power Fx is gebaseerd op formules die een naam aan een expressie binden. Net als in Excel-werkbladen, wanneer de inkomende afhankelijkheden van de expressie veranderen, wordt de expressie opnieuw berekend en verandert de waarde van de naam, waardoor de herberekening mogelijk in andere formules wordt omgezet.

Deze grammatica omvat het expressiegedeelte van de formule. Het binden aan een naam om een formule te maken, is afhankelijk van hoe Power Fx is geïntegreerd. In werkbladen wordt de bindingssyntaxis niet weergegeven, maar wordt deze geïmpliceerd door de locatie waar de uitdrukking is geschreven, bijvoorbeeld door invoeren van =B1 in de A1-cel. In sommige gevallen is helemaal geen binding vereist en wordt Power Fx gebruikt als een expressie-evaluator, bijvoorbeeld ter ondersteuning van berekende kolommen van een databasetabel. Voor Power Apps wordt de binding geïmpliceerd bij het werken in Power Apps Studio met een serialisatie-indeling op basis van YAML voor gebruik buiten Power Apps Studio.

Conventies met betrekking tot de grammatica

De lexicale en syntactische grammatica's worden weergegeven met behulp van grammaticaproducties. Elke productieregel voor de grammatica definieert een niet-terminaal symbool en de mogelijke uitbreidingen van het desbetreffende niet-terminale symbool in reeksen van niet-terminale of terminale symbolen. In grammaticaproducties worden niet-terminale symbolen cursief weergegeven. Terminale symbolen worden weergegeven in een lettertype met een vaste breedte.

De eerste regel van een grammaticaproductie is de naam van het niet-terminale symbool dat wordt gedefinieerd, gevolgd door een dubbele punt. Elke volgende ingesprongen regel bevat een mogelijke uitbreiding van het niet-terminale symbool en wordt opgegeven als een reeks van niet-terminale of terminale symbolen. Neem bijvoorbeeld de volgende productieregel:

   GlobaleIdentifier:
     [@ Identificatie]

definieert dat een GlobalIdentifier moet bestaan uit het token [@, gevolgd door een id, gevolgd door het token ].

Wanneer er meer dan één mogelijke uitbreiding van een niet-terminaal symbool is, worden de alternatieven weergegeven op afzonderlijke regels. De subscript opt wordt gebruikt om een optioneel symbool aan te geven. Neem bijvoorbeeld de volgende productieregel:

   Functieaanroep:
     Functie-ID(Functie-argumentenopt)

is een korte aanduiding voor:

   Functieaanroep:
     Functie-ID()
     Functie-ID(FunctieArgumenten)

Alternatieven worden normaal gesproken vermeld op afzonderlijke regels. Als er echter een groot aantal alternatieven is, kan de lijst met uitbreidingen op één regel worden voorafgegaan door de tekst 'one of' (een van). Dit is eenvoudigweg de korte manier voor de weergave van alle alternatieven op afzonderlijke regels.

Neem bijvoorbeeld de volgende productieregel:

   Decimaalcijfer:een van
    0123456789

is een korte aanduiding voor:

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

Lexicale analyse

De productie van lexicale eenheden definieert de lexicale grammatica voor een Power Fx-uitdrukking. Elke geldige Power Fx-expressie voldoet aan deze grammatica.

   Expressie-eenheid:
     Expressie-elementenopt

   Expressie-elementen:
     Expressie-element
     Expressie-elementExpressie-elementenopt

   Expressie-element:
     Witruimte
     opmerking

Op lexicaal niveau bestaat een Power Fx-expressie uit de volgende stroom: Whitespace-, Comment- en Token-elementen. Deze productieregels worden besproken in de volgende secties. Alleen Token-elementen zijn belangrijk in de syntactische grammatica.

Spatie

Witruimte (Whitespace) wordt gebruikt om opmerkingen en tokens binnen een Power Apps-document te scheiden.

   Witruimte:
    elk Unicode Space-scheidingsteken (klasse Zs)
    elk Unicode Line-scheidingsteken (klasse Zl)
    elk Unicode Paragraph-scheidingsteken (klasse Zp)
    Horizontaal tabteken (U+0009)
    Teken voor regelinvoer (U+000A)
    Verticaal tabteken (U+000B)
    Teken voor paginadoorvoer (U+000C)
    Teken voor regelterugloop (U+000D)
    Teken voor volgende regel (U+0085)

Opmerkingen

Er worden twee soorten opmerkingen ondersteund:

  • Eenregelige opmerkingen beginnen met de tekens // en worden uitgebreid naar het einde van de bronregel.
  • Gescheiden opmerkingen beginnen met de tekens /* en eindigen met de tekens */. Commentaar met scheidingstekens kan meerdere regels omvatten.

   Commentaar:
     AfgebakendCommentaar
     SingleLineComment

   SingleLineComment:
     // EnkeleRegelCommentaarTekensopt

   EnkeleRegelCommentaarTekens:
     EnkeleRegelCommentaarKarakter
     EnkeleRegelCommentaarTekenEnkeleRegelCommentaarTekensopt

   EnkelRegelCommentaarKarakter:
    alle Unicode-tekens behalve een NewLineCharacter

   Gescheidenopmerking:
     /* Gescheiden opmerkingentekensopt*/

   Gescheiden commentaartekens:
     GescheidenopmerkingTekensGeenAsteriskGescheidenopmerkingTekensopt
     * GescheidenopmerkingNaAsteriskTekens

   GescheidenopmerkingNaAsteriskTekens:
     GescheidenopmerkingGeenSlashAsteriskTekenGescheidenopmerkingTekensopt
     * GescheidenopmerkingNaAsteriskTekens

   GescheidenCommentaarTekensGeenAsterisk:
    elk Unicode-teken behalve * (asterisk)

   GescheidenopmerkingGeenSlashAsteriskKarakter:
    elk Unicode-teken behalve / (slash) of * (asterisk)

Commentaarregels zijn niet genest. De tekenreeksen /* en */ hebben geen speciale betekenis binnen een eenregelig commentaar. De tekenreeksen // en /* hebben geen speciale betekenis binnen een commentaar met scheidingstekens.

Commentaar wordt niet verwerkt binnen letterlijke tekstwaarden (literals).

Het volgende voorbeeld bevat twee gescheiden opmerkingen:

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

De volgende voorbeelden bevatten drie opmerkingen van één regel:

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

Letterlijke waarden

Een literal oftewel letterlijke waarde is een representatie van de broncode van een waarde.

   Letterlijk:
     LogischLetterlijk
     NummerLiteraal
     TekstLiteraal

Logische literals

Er wordt een logische letterlijke waarde (logical literal) gebruikt voor het schrijven van de waarden waar en onwaar, en dit resulteert in een logische waarde.

   LogischLiteraal:een van
    truefalse

Numerieke letterlijke waarden

Een numerieke letterlijke waarde (number literal) wordt gebruikt om een numerieke waarde te schrijven en resulteert in een getalwaarde.

   GetalLiteraal:
     Decimale cijfersExponentdeelopt
     DecimaleCijfersDecimaleScheidingstekenDecimaleCijfersoptExponentDeelopt
     DecimaalscheidingstekenDecimale cijfersExponentdeelopt

   Decimale cijfers:
     Decimaalcijfer
     DecimaleCijfersDecimaalCijfer

   Decimaalcijfer:een van
    0123456789

   ExponentDeel:
     ExponentIndicatorTekenoptDecimale cijfers

   ExponentIndicator:een van
    eE

   Teken:een van
    +-

Letterlijke tekstwaarde

Een letterlijke tekstwaarde (text literal) wordt gebruikt voor het schrijven van een reeks Unicode-tekens en resulteert in een tekstwaarde. Letterlijke tekstwaarden worden tussen dubbele aanhalingstekens geplaatst. Om dubbele aanhalingstekens in de tekstwaarde op te nemen, herhaalt u de dubbele aanhalingstekens, zoals weergegeven in het volgende voorbeeld:

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

   TekstLiteraal:
     " TekstLetterlijkeTekensopt"

   Tekstletterlijke tekens:
     TekstLetterlijkTekenTekstLetterlijkTekensopt

   TekstLiteraalKarakter:
     TekstKarakterGeenDubbele aanhalingstekens
     DubbelQuoteEscapeSequence

   TekstKarakterGeenDubbeleAanhalingstekens:
    elk Unicode-codepunt behalve dubbele aanhalingstekens

   DubbelQuoteEscapeSequence:
    ""

Identifiers

Een id (identifier) is een naam die wordt gebruikt om naar een waarde te verwijzen. Id's kunnen reguliere id's of id's met enkele aanhalingstekens zijn.

   Identificatie:
     IdentifierNamemaarnietoperatorofContextKeyword

   Identificatienaam:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' Enkelvoudige aanhalingstekenidentificatie'

   IdentificatieBeginkarakter:
     LetterKarakter
    _

   IdentifierDoorgaanKarakter:
     IdentifierStartCharacter
     DecimaalCijferKarakter
     VerbindendKarakter
     CombinerenKarakter
     OpmaakKarakter

   IdentifierDoorgaanTekens:
     IdentifierDoorgaanTekenIdentifierDoorgaanTekensopt

   LetterKarakter:
    elk Unicode-teken van de klasse Hoofdletter (Lu) of Kleine letter (Ll)
    elk Unicode-teken van de klasse Titelletter (Lt)
    elk Unicode-teken van de klasse Lettermodificator (Lm) of Letter overig (Lo)
    elk Unicode-teken van de klasse Nummerletter (Nl)

   CombinerendKarakter:
    elk Unicode-teken van de klasse Markering zonder tussenruimte (Mn) of Tussenruimte combinatie met markering (Mc)

   DecimaalCijferTeken:
    elk Unicode-teken van de klasse Decimaal cijfer (Nd)

   VerbindendKarakter:
    elk Unicode-teken van de klasse Connector-interpunctie (Pc)

   OpmaakKarakter:
    elk Unicode-teken van de klasse Notatie (Cf)

Id's met enkele aanhalingstekens

Een single quoted-identifier kan een reeks van Unicode-tekens bevatten om te gebruiken als id, inclusief trefwoorden, witruimte, commentaar en operators. Enkele aanhalingstekens worden ondersteund met een escape-reeks van twee enkele aanhalingstekens.

   Enkelvoudigeaanhalingstekenidentificatie:
     Enkelvoudige aanhalingstekensIdentifierTekens

   Enkelvoudige aanhalingstekensIdentifierCharacters:
     Enkelvoudige aanhalingstekensIdentifierTekensEnkelvoudige aanhalingstekensIdentifierTekensopt

   Enkelvoudig aanhalingsteken-ID-teken:
     TekstTekensGeenEnkeleQuote
     EnkelvoudigQuoteEscapeSequence

   TekstTekensGeenEnkeleQuote:
    elk Unicode-teken behalve ' (U+0027)

   EnkelvoudigeQuoteEscapeSequence:
    ''

Ondubbelzinnige identifier

   Ondubbelzinnige identificatie:
     Tabelkolomidentificatie
     Globale identificatie

   Tabelkolom-ID:
     Identificatie[@Identificatie]

   Globale identificatie:
     [@ Identificatie]

Contexttrefwoorden

   ContextTrefwoord:
    Parent
    Self
    ThisItem
    ThisRecord

Hoofdlettergevoelig

Power Apps-id's zijn hoofdlettergevoelig. De ontwerptool zal ze automatisch in de juiste vorm veranderen wanneer een formule wordt geschreven.

Scheidingstekens

   Decimaalscheidingsteken:
     . (punt) voor talen die een punt gebruiken als scheidingsteken voor decimale getallen, bijvoorbeeld 1.23
     , (komma) voor talen die een komma gebruiken als scheidingsteken voor decimale getallen, bijvoorbeeld 1,23

   LijstSeparator:
     , (komma) als DecimalSeparator. (punt) is
     ; (puntkomma) als decimaalscheidingsteken (komma) is ,

   Kettingscheidingsteken:
     ; (puntkomma) als decimaalscheidingsteken. (punt) is
     ;; (dubbele puntkomma) als DecimalSeparator (komma) is ,

Operatoren

Operators worden in formules gebruikt om bewerkingen te beschrijven die betrekking hebben op een of meer operanden. De expressie a + b gebruikt bijvoorbeeld de operator + om de twee operanden a en b toe te voegen.

   operator:
     BinaireOperator
     BinaireOperatorVereistWitruimte
     Voorvoegseloperator
     PrefixOperatorVereistWitruimte
     Postfix-operator

   BinaryOperator:een van
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Witruimte
     Or Witruimte

   VoorvoegselOperator:
    !

   PrefixOperatorVereistWitruimte:
     Not Witruimte

   PostfixOperator:
    %

Referentie-operator

   ReferenceOperator:een van
    .!

Objectverwijzing

   Referentie:
     Basisreferentie
     BaseReferenceReferenceOperatorReferenceList

   Basisreferentie:
     Identificatie
     Ondubbelzinnige identificatie
     ContextTrefwoord

   Referentielijst:
     Identificatie
     IdentifierReferenceOperatorReferenceList

Inline record

   Inline-record:
     { InlineRecordListopt}

   InlineRecordLijst:
     Identifier:Expressie
     Identificatie:ExpressieListSeparatorInlineRecordList

Inline tabel

   InlineTabel:
     [ InlineTableListopt]

   InlineTabelLijst:
     Uitdrukking
     ExpressieListSeparatorInlineTableList

Expression

   Uitdrukking:
     Letterlijk
     Referentie
     Inline-record
     InlineTabel
     Functieaanroep
     ( Uitdrukking)
     PrefixOperatorExpressie
     ExpressiePostfixOperator
     ExpressieBinaryOperatorExpressie

Keten met expressies

   Gekoppelde expressie:
     Uitdrukking
     ExpressieChainingSeparatorChainedExpressionopt

Functie-aanroep

   Functieaanroep:
     Functie-ID(Functie-argumentenopt)

   Functie-ID:
     Identificatie
     Identifier.FunctieIdentifier

   FunctieArgumenten:
     Gekoppelde expressie
     ChainedExpressionListSeparatorFunctieArgumenten