Sdílet prostřednictvím


Gramatika výrazů

Poznámka:

Microsoft Power Fx je nový název jazyka vzorců pro aplikace plátna. Práce na těchto článcích stále probíhá, jak extrahujeme jazyk z aplikací plátna, integrujeme jej s ostatními produkty Microsoft Power Platform a zpřístupňujeme jako open source. Začněte v části Přehled jazyka Microsoft Power Fx obsahující úvod do jazyka.

Microsoft Power Fx je založen na vzorcích, které svazují název a výraz. Stejně jako v listech aplikace Excel se při změně příchozích závislostí výrazu výraz přepočítá a změní se hodnota názvu, což se případně kaskádově přepočítá do jiných vzorců.

Tato gramatika zahrnuje část vzorce tvořenou výrazem. Vazba na název pro vytvoření vzorce závisí na tom, jak je integrován Power Fx. V listech není ukázána syntaxe vazby, je implikována umístěním, kde je výraz zapsán, například zadáním =B1 v buňce A1. V některých případech není vůbec nutná žádná vazba a Power Fx je používán jako vyhodnocovač výrazů, například při podpoře počítaných sloupců databázové tabulky. V případě Power Apps je vazba implicitní při práci v Power Apps Studio s formátem serializace založeným na YAML pro použití mimo Power Apps Studio.

Gramatické zásady

Gramatika slov a syntaxe se zobrazuje pomocí gramatických produkcí. Každá produkce definuje neterminální symbol a jeho možná rozšíření do sekvencí neterminálních nebo terminálních symbolů. V gramatických produkcích se neterminální symboly uvádí kurzívou a terminální symboly písmem s pevnou šířkou.

První řádek produkce představuje název definovaného neterminálního symbolu následovaný dvojtečkou. Každý po sobě jdoucí odsazený řádek obsahuje možné rozšíření neterminálního symbolu v podobě sekvence neterminálních a terminálních symbolů. Například tato produkce:

  GlobalIdentifier:
    [@Identifikátor]

definuje GlobalIdentifier (globální identifikátor) sestávající z tokenu [@ následovaného identifikátorem následovaného tokenem].

Když existuje více než jedno možné rozšíření neterminálního symbolu, jsou alternativy uvedeny na samostatných řádcích. Dolní index „opt“ slouží k označení volitelného symbolu. Například tato produkce:

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsvolba)

představuje zkrácený tvar této produkce:

  FunctionCall:
    FunctionIdentifier()
    FunctionIdentifier(FunctionArguments)

Alternativy se obvykle uvádí na samostatných řádcích. Pokud je alternativ mnoho, rozšíření jsou uvedena na jednom řádku a předchází jim fráze „může být“. Jedná se jednoduše o zkrácenou verzi, aby nebylo nutné vypisovat každou alternativu na samostatné řádky.

Například tato produkce:

  DecimalDigit:jeden z
    0123456789

představuje zkrácený tvar této produkce:

  Desetinné číslo:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

Lexikální analýza

Produkce lexikální jednotky definuje lexikální gramatiku pro výraz Power Fx. Každý platný výraz Power Fx odpovídá této gramatice.

  ExpressionUnit:
    ExpressionElementsopt

  ExpressionElements:
    ExpressionElement
    ExpressionElementExpressionElementsopt.

  ExpressionElement:
    Mezera
    Komentář

Na úrovni slov se výraz Power Fx skládá z proudu prvků Whitespace (prázdný znak), Comment (komentář) a Token. Jednotlivé typy produkcí jsou probrány v následujících částech. V gramatice syntaxe jsou významné jen prvky Token.

Prázdný znak

Prázdné znaky slouží k oddělení komentářů a tokenů v dokumentu Power Apps.

  Mezera:
    jakýkoli Unicode znak mezery (třída Zs)
    jakýkoli Unicode znak řádku (třída Zl)
    jakýkoli Unicode znak odstavce (třída Zp)
    Znak horizontálního tabulátoru (U+0009)
    Znak odřádkování (U+000A)
    Znak vertikálního tabulátoru (U+000B)
    Znak posunu stránky (U+000C)
    Znak návratu na začátek řádku (U+000D)
    Znak nového řádku (U+0085)

Komentáře

Podporovány jsou dvě formy komentářů:

  • Jednořádkové komentáře začínají znaky // a končí na konci řádku zdrojového kódu.
  • Komentáře s oddělovači začínají a končí znaky /* a */. Komentáře s oddělovači mohou být rozloženy na více řádků.

  Komentář:
    Oddělený komentář
    SingleLineComment

  SingleLineComment:
    //SingleLineCommentCharactersvol

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharactersvolba

  SingleLineCommentCharacter:
    jakékoli znaky Unicode kromě NewLineCharacter

  DelimitedComment:
    /*DelimitedCommentCharactersvol*/

  Znaky s odděleným komentářem:
    DelimitedCommentCharactersNohvězdičkaDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskChaacters

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashHvězdičkaCharacterDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskChaacters

  DelimitedCommentCharactersNoHvězdička:
    jakýkoli znak Unicode kromě * (hvězdička)

  DelimitedCommentNoSlashHvězdičkaCharacter:
    jakýkoli znak Unicode kromě / (lomítko) nebo * (hvězdička)

Komentáře nejsou vnořené. Sekvence znaků /* a */ nemá v rámci jednořádkových komentářů žádný speciální význam. To stejné platí se sekvencemi // a /* v komentářích s oddělovači.

Komentáře se nezpracovávají v řetězcích textových literálů.

Následující příklad obsahuje dva oddělené komentáře:

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

Následující příklady zahrnují tři jednořádkové komentáře:

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

Literály

Literál představuje ve zdrojovém kódu hodnotu.

  Doslov:
    LogicalLiteral
    NumberLiteral
    TextLiteral

Logické literály

Logický literál slouží k zápisu hodnot true a false a dává logickou hodnotu.

  LogicalLiteral:jeden z
    truefalse

Číselné literály

Číselný literál slouží k zápisu číselné hodnoty a dává také číselnou hodnotu.

  NumberLiteral:
    DecimalDigitsExponentPartvolba
    Desetinné čísliceOddělovač desetinných místDesetinné čísliceoptExponentPartopt
    DecimalSeparatorDesetinné čísliceExponentPartvolba

  Desetinné číslice:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:jeden z
    0123456789

  ExponentPart:
    ExponentIndicatorZnaménkooptDesetinná čísla

  ExponentIndicator:jeden z
    eE

  Sign:jeden z
    +-

Textové literály

Textový literál slouží k zápisu sekvence znaků Unicode a dává textovou hodnotu. Textové literály jsou uzavřeny v dvojitých uvozovkách. Chcete-li do textové hodnoty zahrnout dvojité uvozovky, zadejte je dvakrát, jak je znázorněno v následujícím příkladu:

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

  TextLiteral:
    "TextLiteralCharactersvol"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharactersvolba

  TextLiteralCharacter:
    TextCharacterNoDoubleQuote
    DoubleQuoteEscapeSequence

  TextCharacterNoDoubleQuote:
    jakýkoli bod kódu Unicode kromě dvojitých uvozovek

  DoubleQuoteEscapeSequence:
    ""

Identifikátory

Identifikátor je název, který slouží k odkazování na hodnotu. Identifikátory mohou být buď běžné, nebo v jednoduchých uvozovkách.

  Identifikátor:
    IdentifierNamealeneOperátorneboKontextKeyword

  IdentifierName:
    IdentifierStartCharacterIdentifierContinueCharactersvolba
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    PísmenoZnak
    _

  IdentifierContinueCharacter:
    IdentifierStartCharacter
    DecimalDigitCharacter
    ConnectingCharacter
    Kombinující charakter
    Formátování znaku

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersvolba

  Písmeno:
    jakýkoli znak Unicode třídy Velké písmeno (Lu) nebo Malé písmeno (Ll)
    jakýkoli znak Unicode ve třídě Velké počáteční písmeno (Lt)
    jakýkoli znak Unicode třídy Modifikátor písmena (Lm) nebo Ostatní písmena (Lo)
    jakýkoli znak Unicode ve třídě Písmeno číslice (Nl)

  Kombinující znak:
    jakýkoli znak Unicode třídy Značka bez mezery (Mn) nebo Značka kombinující mezery (Mc)

  DecimalDigitCharacter:
    libovolný znak Unicode třídy Desetinná číslice (Nd)

  ConnectingCharacter:
    jakýkoli znak Unicode třídy Interpunkce konektoru (Pc)

  Formátovací znak:
    jakýkoli znak Unicode třídy Formát (Cf)

Identifikátory ve formě jednoduchých uvozovek

Identifikátor ve formě jednoduchých uvozovek může obsahovat libovolně dlouhou sekvenci znaků Unicode, kterou lze použít jako identifikátor, včetně klíčových slov, prázdných znaků, komentářů a operátorů. Znaky jednoduchých uvozovek lze uvést sekvencí dvou jednoduchých uvozovek.

  SingleQuotedIdentifier:
    SingleQuotedIdentifierCharacters

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersvolba

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence

  TextCharactersNoSingleQuote:
    libovolný znak Unicode vyjma ' (U+0027)

  SingleQuoteEscapeSequence:
    ''

Nerozlišený identifikátor

  DisambiguatedIdentifier:
    TableColumnIdentifier
    GlobalIdentifier

  TableColumnIdentifier:
    Identifikátor[@Identifikátor]

  GlobalIdentifier:
    [@Identifikátor]

Kontextová klíčová slova

  Kontextové klíčové slovo:
    Parent
    Self
    ThisItem
    ThisRecord

Rozlišování malých a velkých písmen

U identifikátorů Power Apps se rozlišují malá a velká písmena. Nástroj pro vytváření při psaní vzorce písmena automaticky změní na správnou velikost.

Oddělovače

  Desetinný oddělovač:
    . (tečka) pro jazyky, které používají tečku jako oddělovač například pro desetinná čísla 1.23
    , (čárka) pro jazyky, které používají čárku jako oddělovač například desetinných čísel 1,23

  Oddělovač seznamu:
    , (čárka) if Desetinný oddělovač je . (tečka)
    ; (středník) if Desetinný oddělovač je , (čárka)

  Řetězový oddělovač:
    ; (středník) if Desetinný oddělovač je . (tečka)
    ;; (dvojitý středník) pokud Oddělovač desetinných míst je , (čárka)

Operátory

Operátory ve vzorcích slouží k popisu operací zahrnujících jeden nebo více operandů. Například výraz a + b sečte pomocí operátoru + dva operandy a a b.

  Operátor:
    Binární operátor
    BinaryOperatorRequiresWhitespace
    PrefixOperator
    PrefixOperatorRequiresWhitespace
    PostfixOperator

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

  BinaryOperatorRequiresWhitespace:
    AndMezera
    OrMezera

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotMezera

  PostfixOperator:
    %

Referenční operátor

  ReferenceOperator:jeden z
    .!

Odkaz na objekt

  Odkaz:
    BaseReference
    BaseReferenceReferenceOperatorReferenceList

  Základní reference:
    Identifikátor
    DisambiguatedIdentifier
    ContextKeyword

  ReferenceList:
    Identifikátor
    IdentifikátorOperátor referenceSeznam odkazů

Vložený záznam

  InlineRecord:
    {InlineRecordListopt}

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

Vložená tabulka

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Výraz
    VýrazSeparátor seznamuInlineTableList

Expression

  Výraz:
    Doslovný
    Odkaz
    InlineRecord
    InlineTable
    Funkce volání
    (Výraz)
    PrefixOperatorVýraz
    VýrazOperátor Postfix
    VýrazBinární operátorVýraz

Zřetězené výrazy

  Řetězovaný výraz:
    Výraz
    ExpressionChainingSeparatorChainedExpressionvolba

Volání funkce

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsvolba)

  Identifikátor funkce:
    Identifikátor
    Identifikátor.Identifikátor funkce

  Funkční Argumenty:
    Řetězovaný výraz
    ChainedExpressionListSeparatorFunctionArguments