Zdieľať cez


Výrazová gramatika

Poznámka

Microsoft Power Fx je nový názov jazyka vzorcov pre aplikácie plátna. Tieto články sú rozpracované, pretože jazyk extrahujeme z aplikácií plátna a integrujeme ho s ostatnými produktmi Microsoft Power Platform, aby sme ho sprístupnili ako open source. Začnite s prehľadom Microsoft Power Fx ako úvod do jazyka.

Microsoft Power Fx je založený na vzorcoch, ktoré viažu názov k výrazu. Rovnako ako v hárkoch programu Excel, keď sa zmenia prichádzajúce závislosti výrazu, výraz sa prepočíta a zmení sa hodnota názvu, čo môže viesť k kaskádovému prepočtu do iných vzorcov.

Táto gramatika pokrýva výrazovú časť vzorca. Viazanie na meno, aby sa vytvoril vzorec, závisí od toho, ako je integrovaný Power Fx. V hárkoch nie je sprístupnená syntax väzby, je implikovaná miestom, kde je výraz napísaný – napríklad zadanie =B1 v bunke A1. V niektorých prípadoch sa nevyžaduje vôbec žiadna väzba a Power Fx sa používa ako vyhodnocovač výrazov, napríklad na podporu vypočítaných stĺpcov databázovej tabuľky. Pre Power Apps sa väzba implikuje pri práci v Power Apps Studio s formátom serializácie založeným na YAML na použitie mimo Power Apps Studio.

Gramatické pravidlá

Lexikálne a syntaktické gramatiky sú prezentované pomocou gramatických produkcií. Každá gramatická produkcia definuje nekoncový symbol a možné rozšírenia tohto nekoncového symbolu do postupností nekoncových alebo koncových symbolov. V gramatických produkciách sa nekoncové symboly zobrazujú kurzívou a koncové symboly sa zobrazujú písmom s pevnou šírkou.

Prvým riadkom gramatickej produkcie je názov práve definovaného nekoncového symbolu, za ktorým nasleduje dvojbodka. Každý nasledujúci odsadený riadok obsahuje možné rozšírenie nekoncového symbolu, ktorý je daný ako postupnosť nekoncových alebo koncových symbolov. Napríklad produkcia:

   GlobalIdentifier:
     [@ Identifikátor]

definuje GlobalIdentifier, ktorý pozostáva z tokenu [@, za ktorým nasleduje Identifikátor, za ktorým nasleduje token ].

Keď existuje viac rozšírení nekoncového symbolu, alternatívy sú uvedené v samostatných riadkoch. Na označenie voliteľného symbolu sa používa index „opt“. Napríklad produkcia:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

je skratka pre:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

Alternatívy sú zvyčajne uvedené v samostatných riadkoch, aj keď v prípadoch, kde existuje veľké množstvo alternatív, zoznamu rozšírení uvedených v jednom riadku môže predchádzať fráza „jeden z“. Toto je jednoducho skratka pre každú alternatívu v samostatných riadkoch.

Napríklad produkcia:

   DecimalDigit:jedna z
    0123456789

je skratka pre:

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

Lexikálna analýza

Produkcia lexical-unit definuje lexikálnu gramatiku pre výraz Power Fx. Každý platný výraz Power Fx zodpovedá tejto gramatike.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     Medzery
     Komentujte

Na lexikálnej úrovni sa výraz jazyka Power Fx skladá zo streamu prvkov Prázdny znak, Komentár a Token. Každá z týchto produkcií je popísaná v nasledujúcich sekciách. V syntaktickej gramatike sú významné iba prvky Token.

Prázdny znak

Prázdne znaky sa používajú na oddelenie komentárov a tokenov v rámci dokumentu Power Apps.

   Medzera:
    akýkoľvek oddeľovač medzery Unicode (trieda Zs)
    akýkoľvek oddeľovač riadka Unicode (trieda Zl)
    akýkoľvek oddeľovač odsekov Unicode (trieda Zp)
    Znak vodorovného tabulátora (U+0009)
    Znak posunu riadka (U+000A)
    Znak zvislého tabulátora (U+000B)
    Znak posunu riadka (U+000C)
    Znak návratu na začiatok riadka (U+000D)
    Znak nasledujúceho riadka (U+0085)

Vytvoril

Podporované sú dve formy komentárov:

  • Jednoriadkové komentáre, ktoré začínajú znakmi // a rozširujú sa na koniec zdrojového riadka.
  • Komentáre s oddeľovačmi, ktoré začínajú znakmi /* a končia znakmi */. Komentáre s oddeľovačmi môžu obsahovať viacero riadkov.

   Komentár:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersvoliteľné

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    akékoľvek znaky Unicode okrem znaku NewLineCharacter

   DelimitedComment:
     /* Znaky s oddeleným komentáromvol*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNohviezdičkaDelimitedCommentCharactersopt
     * Oddelený komentár po znakoch hviezdičky

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashHviezdičkaCharacterDelimitedCommentCharactersopt
     * Oddelený komentár po znakoch hviezdičky

   Znaky s oddeleným komentárom bez hviezdičky:
    ľubovoľný znak Unicode okrem * (hviezdička)

   DelimitedCommentNoSlashHviezdičkaCharacter:
    ľubovoľný znak Unicode okrem / (lomka) alebo * (hviezdička)

Komentáre nie sú vnorené. Postupnosti znakov /* a */ nemajú v jednoriadkovom komentári žiadny zvláštny význam a postupnosti znakov // a /* nemajú v komentári s oddeľovačmi žiadny zvláštny význam.

Komentáre sa nespracovávajú v reťazcoch explicitných hodnôt premenných.

Nasledujúci príklad obsahuje dva komentáre s oddeľovačmi:

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

Nasledujúce príklady zahŕňajú tri jednoriadkové komentáre:

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

Explicitné hodnoty premenných

Explicitná hodnota premennej je reprezentácia zdrojového kódu hodnoty.

   Doslov:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Logické explicitné hodnoty premenných

Logická explicitná hodnota premennej sa používa na zápis hodnôt pravda a nepravda a na vytvorenie logickej hodnoty.

   LogicalLiteral:jeden z
    truefalse

Číselné explicitné hodnoty premenných

Číselná explicitná hodnota premennej sa používa na zápis číselnej hodnoty a vytvorenie číselnej hodnoty.

   NumberLiteral:
     DecimalDigitsExponentPartopt
     Desatinné čísliceOddeľovač desatinných miestDesatinné čísliceoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartvoliteľné

   Desatinné číslice:
     DecimalDigit
     DecimalDigitsDecimalDigits

   DecimalDigit:jedna z
    0123456789

   ExponentPart:
     ExponentIndicatorZnakoptDecimalDigits

   ExponentIndicator:jeden z
    eE

   Podpíšte:jeden z
    +-

Textové explicitné hodnoty premennej

Textová explicitná hodnota premennej sa používa na zápis postupnosti znakov Unicode a na vytvorenie textovej hodnoty. Textové explicitné hodnoty premennej sú uzavreté v úvodzovkách. Ak chcete do textovej hodnoty zahrnúť dvojité úvodzovky, opakujte dvojité úvodzovky, ako je to znázornené v nasledujúcom príklade:

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

   TextLiteral:
     " TextLiteralCharactersvoliteľné"

   TextLiteralCharacters:
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter:
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   TextCharacterNoDoubleQuote:
    akýkoľvek bod kódu Unicode okrem dvojitej úvodzovky

   DoubleQuoteEscapeSequence:
    ""

Identifikátory

Identifikátor je názov, ktorý sa používa na odkazovanie na hodnotu. Identifikátory môžu byť buď regulárne identifikátory alebo identifikátory v jednoduchých úvodzovkách.

   Identifikátor:
     IdentifierNamealenieOperátoraleboKontextové kľúčové slovo

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     Kombinovanie znakov
     Formátovaniecharakteru

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   Písmeno:
    akýkoľvek znak Unicode triedy Veľké písmeno (Lu) alebo Malé písmeno (Ll)
    akýkoľvek znak Unicode triedy Písmeno nadpisu (Lt)
    akýkoľvek znak Unicode triedy Modifikátor písmena (Lm) alebo Iné písmeno (Lo)
    akýkoľvek znak Unicode triedy Číselné písmeno (Nl)

   Kombinovaný znak:
    akýkoľvek znak Unicode triedy Značka bez medzery (Mn) alebo Značka kombinujúca medzeru (Mc)

   DecimalDigitCharacter:
    akýkoľvek znak Unicode triedy Desatinná číslica (Nd)

   ConnectingCharacter:
    akýkoľvek znak Unicode triedy Interpunkcia konektora (Pc)

   Formátovací znak:
    akýkoľvek znak Unicode triedy Formát (Cf)

Identifikátory v jednoduchých úvodzovkách

Identifikátor jednoduchej úvodzovky môže obsahovať akúkoľvek postupnosť znakov Unicode, ktoré sa majú použiť ako identifikátor, vrátane kľúčových slov, prázdnych znakov, komentárov a operátorov. Znaky jednoduchých úvodzoviek sú podporované „escape“ postupnosťou dvoch jednoduchých úvodzoviek.

   SingleQuotedIdentifier:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersvoliteľné

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    ľubovoľný znak Unicode okrem ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Jednoznačný identifikátor

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifikátor[@Identifikátor]

   GlobalIdentifier:
     [@ Identifikátor]

Kontextové kľúčové slová

   Kontextové kľúčové slovo:
    Parent
    Self
    ThisItem
    ThisRecord

Rozlišovanie malých a veľkých písmen

Pri identifikátoroch Power Apps sa rozlišujú malé a veľké písmená. Nástroj na tvorbu obsahu ich pri písaní vzorca automaticky zmení na správne veľké a malé písmená.

Oddeľovače

   Decimal Separator:
     . (bodka) pre jazyky, ktoré napríklad používajú bodku ako oddeľovač desatinných čísel 1.23
     , (čiarka) pre jazyky, ktoré používajú čiarku ako oddeľovač desatinných čísel, napr 1,23

   Oddeľovač zoznamu:
     , (čiarka) ak Oddeľovač desatinných miest je . (bodka)
     ; (bodkočiarka) ak Oddeľovač desatinných miest je , (čiarka)

   Reťazový oddeľovač:
     ; (bodkočiarka), ak Oddeľovač desatinných miest je . (bodka)
     ;; (dvojitá bodkočiarka) ak Oddeľovač desatinných miest je , (čiarka)

Operátory

Operátory sa používajú vo vzorcoch na popis operácií zahrňujúcich jeden alebo viac operandov. Napríklad výraz a + b pomocou operátora + pridá dva operandy a a b.

   operátor:
     Binárny operátor
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

   BinaryOperator:jeden z
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   BinaryOperatorRequiresWhitespace:
     And Medzery
     Or Medzery

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Medzery

   PostfixOperator:
    %

Referenčný operátor

   Referenčný operátor:jeden z
    .!

Odkaz na objekt

   Referencia:
     Základná referencia
     BaseReferenceReferenceOperatorReferenceList

   Základná referencia:
     Identifikátor
     DisambiguatedIdentifier
     Kontextové kľúčové slovo

   Referenčný zoznam:
     Identifikátor
     IdentifikátorReferenčný operátorZoznam referencií

Vnorený záznam

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifikátor:Výraz
     Identifikátor:VýrazSeparátor zoznamuInlineRecordList

Vnorená tabuľka

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Výraz
     ExpressionListSeparatorInlineTableList

Expression

   Výraz:
     Doslovný
     Odkaz
     InlineRecord
     InlineTable
     FunctionCall
     ( Výraz)
     PrefixOperatorVýraz
     VýrazOperátor Postfix
     VýrazBinárny operátorVýraz

Reťazené výrazy

   ChainedExpression:
     Výraz
     ExpressionChainingSeparatorChainedExpressionopt

Volanie funkcie

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identifikátor
     Identifikátor.Identifikátor funkcie

   Funkčné argumenty:
     Chained Expression
     ChainedExpressionListSeparatorFunctionArguments