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:
    [@Identifier]

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(FunctionArgumentsopt)

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:one of
    0123456789

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

  DecimalDigit:
    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:
    Bílý znak
    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.

  Bílý znak:
    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ář:
    DelimitedComment
    SingleLineComment

  SingleLineComment:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharactersopt

  SingleLineCommentCharacter:
    jakékoli znaky Unicode kromě NewLineCharacter

  DelimitedComment:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentAfterAsteriskCharacters:
    DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

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

  DelimitedCommentNoSlashAsteriskCharacter:
    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.

  Literal:
    LogicalLiteral
    NumberLiteral
    TextLiteral

Logické literály

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

  LogicalLiteral:one of
    truefalse

Číselné literály

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

  NumberLiteral:
    DecimalDigitsExponentPartopt
    DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  DecimalDigits:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:one of
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDecimalDigits

  ExponentIndicator:one of
    eE

  Sign:one of
    +-

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:
    "TextLiteralCharactersopt"

  TextLiteralCharacters:
    TextLiteralCharacterTextLiteralCharactersopt

  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.

  Identifier:
    IdentifierNamebutnotOperatororContextKeyword

  IdentifierName:
    IdentifierStartCharacterIdentifierContinueCharactersopt
    'SingleQuotedIdentifier'

  IdentifierStartCharacter:
    LetterCharacter
    _

  IdentifierContinueCharacter:
    IdentifierStartCharacter
    DecimalDigitCharacter
    ConnectingCharacter
    CombiningCharacter
    FormattingCharacter

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

  LetterCharacter:
    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)

  CombiningCharacter:
    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)

  FormattingCharacter:
    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:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence

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

  SingleQuoteEscapeSequence:
    ''

Nerozlišený identifikátor

  DisambiguatedIdentifier:
    TableColumnIdentifier
    GlobalIdentifier

  TableColumnIdentifier:
    Identifier[@Identifier]

  GlobalIdentifier:
    [@Identifier]

Kontextová klíčová slova

  ContextKeyword:
    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

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

  ListSeparator:
    , (čárka), pokud DecimalSeparator je . (tečka)
    ; (středník), pokud DecimalSeparator je , (čárka)

  ChainingSeparator:
    ; (středník), pokud DecimalSeparator je . (tečka)
    ;; (dvojitý středník), pokud DecimalSeparator 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.

  Operator:
    BinaryOperator
    BinaryOperatorRequiresWhitespace
    PrefixOperator
    PrefixOperatorRequiresWhitespace
    PostfixOperator

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

  BinaryOperatorRequiresWhitespace:
    AndWhitespace
    OrWhitespace

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotWhitespace

  PostfixOperator:
    %

Referenční operátor

  ReferenceOperator:one of
    .!

Odkaz na objekt

  Reference:
    BaseReference
    BaseReferenceReferenceOperatorReferenceList

  BaseReference:
    Identifier
    DisambiguatedIdentifier
    ContextKeyword

  ReferenceList:
    Identifier
    IdentifierReferenceOperatorReferenceList

Vložený záznam

  InlineRecord:
    {InlineRecordListopt}

  InlineRecordList:
    Identifier:Expression
    Identifier:ExpressionListSeparatorInlineRecordList

Vložená tabulka

  InlineTable:
    [InlineTableListopt]

  InlineTableList:
    Expression
    ExpressionListSeparatorInlineTableList

Expression

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

Zřetězené výrazy

  ChainedExpression:
    Expression
    ExpressionChainingSeparatorChainedExpressionopt

Volání funkce

  FunctionCall:
    FunctionIdentifier(FunctionArgumentsopt)

  FunctionIdentifier:
    Identifier
    Identifier.FunctionIdentifier

  FunctionArguments:
    ChainedExpression
    ChainedExpressionListSeparatorFunctionArguments