Udostępnij za pośrednictwem


Gramatyka wyrażeń

Uwaga

Microsoft Power Fx to nowa nazwa języka formuł dla aplikacji kanw. Te artykuły są pracą w toku, gdyż stale wyodrębniamy język z aplikacji kanw, integrujemy go z innymi produktami Microsoft Power Platform i udostępniamy jako rozwiązanie open source. Zacznij od przeglądu Microsoft Power Fx, aby znaleźć wprowadzenie do języka.

Microsoft Power Fx jest oparte na formułach, które łączą nazwę z wyrażeniem. Podobnie jak w arkuszach programu Excel, jak zależności przychodzące od zmiany wyrażenia, wyrażenie jest ponownie przeliczane, a wartość nazwy zmienia się, a następnie kaskadowo przeliczana jest na inne formuły.

Ta gramatyka odpowiedzialna jest za wyrażenie w formule. Powiązanie z nazwą, aby utworzyć formułę, zależy od tego, jak zintegrowane jest Power Fx. W arkuszach składnia połączenia nie jest wyeksponowana, ale jest ona zapisywana przez lokalizację, w której zostało zapisane wyrażenie — na przykład przez wprowadzenie wyrażenia =B1 w komórce A1. W niektórych przypadkach nie jest w ogóle wymagane powiązanie, a Power Fx używane jest jako narzędzie do oceny wyrażeń. Np. ma to miejsce w przypadku obsługi kolumn obliczanych w tabeli bazy danych. W przypadku Power Apps, powiązanie jest niejawne podczas pracy w Power Apps Studio za pomocą formatu seryjnego opartego na YAML do użycia poza Power Apps Studio.

Konwencje dotyczące gramatyki

Gramatyki leksykalne i składniowe są prezentowane przy użyciu produkcji gramatyki. Każda produkcja gramatyki definiuje symbol niekońcowy i możliwe rozszerzenia tego symbolu na sekwencje symboli niekońcowych i końcowych. W przypadku produkcji gramatyki symbole niekońcowe są pisane kursywą, a symbole końcowe są pisane czcionką o stałej szerokości.

Pierwszy wiersz produkcji gramatyki jest nazwą zdefiniowanego symbolu niekońcowego, po którym następuje dwukropek. Każdy kolejny wiersz z wcięciem zawiera możliwe rozszerzenie niekońcowe podane jako sekwencja symboli niekońcowych lub końcowych. Na przykład produkcja:

   GlobalIdentifier:
     [@ Identifier]

Definiuje element GlobalIdentifier, który ma składać się z tokenu [@, po nim identyfikatora, a po nim tokenu ].

Jeśli istnieje więcej niż jedno możliwe rozszerzenie symbolu niekońcowego, alternatywy są wyświetlane w oddzielnych wierszach. Ten sufiks jako indeks dolny „opcjonalnie” jest używany do wskazania opcjonalnego symbolu. Na przykład produkcja:

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

to skrócona forma produkcji:

   FunctionCall:
     FunctionIdentifier()
     FunctionIdentifier(FunctionArguments)

Alternatywy są zwykle wyświetlane w oddzielnych wierszach, chociaż w przypadkach, gdy istnieje wiele alternatyw, fraza „jedno z następujących” może poprzedzać listę rozszerzeń podaną w jednym wierszu. Jest to po prostu skrócony sposób wyświetlania każdej z alternatyw w osobnych wierszach.

Na przykład produkcja:

   DecimalDigit:one of
    0123456789

to skrócona forma produkcji:

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

Analiza leksykalna

Produkcja jednostek alfabetycznych definiuje leksykę gramatyczną wyrażenia Power Fx. Każde prawidłowe wyrażenie Power Fx jest zgodne z tą gramatyką.

   ExpressionUnit:
     ExpressionElementsopt

   ExpressionElements:
     ExpressionElement
     ExpressionElementExpressionElementsopt

   ExpressionElement:
     Whitespace
     Comment

Na poziomie leksykalnym wyrażenie Power Fx składa się ze strumienia elementów Whitespace, Comment i Token. Każda z tych produkcji została omówiona w poniższych sekcjach. Tylko elementy token są istotne w gramatyce składniowej.

Znak odstępu

Białe znaki są używane do oddzielania komentarzy i tokenów w dokumencie Power Apps.

   Whitespace:
    dowolny separator spacji Unicode (klasa Zs)
    dowolny separator linii Unicode (klasa Zl)
    dowolny separator akapitu Unicode (klasa Zp)
    Znak tabulacji poziomej (U+0009)
    Znak wysuwu wiersza (U+000A)
    Znak tabulacji pionowej (U+000B)
    Znak wysuwu strony (U+000C)
    Znak powrotu karetki (U+000D)
    Znak następnego wiersza (U+0085)

Komentarze

Obsługiwane są dwa typy komentarzy:

  • Komentarze jednowierszowe zaczynają się od znaków // i przechodzą do końca wiersza źródłowego.
  • Komentarze z ogranicznikami rozpoczynają się od znaków /* i kończą się znakami */. Komentarze z ogranicznikami mogą obejmować wiele wierszy.

   Comment:
     DelimitedComment
     SingleLineComment

   SingleLineComment:
     // SingleLineCommentCharactersopt

   SingleLineCommentCharacters:
     SingleLineCommentCharacter
     SingleLineCommentCharacterSingleLineCommentCharactersopt

   SingleLineCommentCharacter:
    wszelkie znaki Unicode poza znakiem NewLineCharacter

   DelimitedComment:
     /* DelimitedCommentCharactersopt*/

   DelimitedCommentCharacters:
     DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters :

   DelimitedCommentAfterAsteriskCharacters:
     DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
     * DelimitedCommentAfterAsteriskCharacters :

   DelimitedCommentCharactersNoAsterisk:
    Dowolny znak Unicode z wyjątkiem gwiazdki (*)

   DelimitedCommentNoSlashAsteriskCharacter:
    Dowolny znak Unicode z wyjątkiem ukośnika (/) oraz gwiazdki (*)

Komentarze nie są zagnieżdżone. Sekwencje znaków /* i */ nie mają specjalnego znaczenia w komentarzu jednowierszowym, a sekwencje znaków // i /* nie mają specjalnego znaczenia w komentarzu z ogranicznikami.

Komentarze nie są przetwarzane w literałach tekstowych.

W następującym przykładzie przedstawiono dwa komentarze z ogranicznikami:

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

W poniższych przykładach przedstawiono trzy jednowierszowe komentarze:

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

Literały

Element literał jest reprezentacją wartości w kodzie źródłowym.

   Literal:
     LogicalLiteral
     NumberLiteral
     TextLiteral

Literały logiczne

Literał logiczny jest używany do zapisywania wartości true i false i produkuje wartość logiczną.

   LogicalLiteral:jeden z
    truefalse

Literały liczbowe

Literał liczbowy jest używany do zapisywania wartości liczbowej i produkuje wartość liczbową.

   NumberLiteral:
     DecimalDigitsExponentPartopt
     DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
     DecimalSeparatorDecimalDigitsExponentPartopt

   DecimalDigits:
     DecimalDigit
     DecimalDigitsDecimalDigit

   DecimalDigit:jeden z
    0123456789

   ExponentPart:
     ExponentIndicatorSignoptDecimalDigits

   ExponentIndicator:jeden z
    eE

   Sign:jeden z
    +-

Literały tekstowe

Literał tekstowy jest używany do zapisania sekwencji znaków Unicode i produkuje wartość tekstową. Literały tekstowe są zamknięte w cudzysłów. Aby uwzględnić w wartości tekstowej cudzysłowy, powtórz te cudzysłowy, jak pokazano w następującym przykładzie:

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

   TextLiteral:
     " TextLiteralCharactersopt"

   TextLiteralCharacters:
     TextLiteralCharacterTextLiteralCharactersopt

   TextLiteralCharacter:
     TextCharacterNoDoubleQuote
     DoubleQuoteEscapeSequence

   TextCharacterNoDoubleQuote:
    dowolny znak punktowy Unicode z wyjątkiem podwójnego cudzysłowu

   DoubleQuoteEscapeSequence:
    ""

Identyfikatory

Element identyfikator to nazwa używana do odwoływania się do wartości. Identyfikatory mogą być zwykłymi identyfikatorami lub identyfikatorami w cudzysłowie pojedynczym.

   Identifier:
     IdentifierNamealenieOperatorlubContextKeyword

   IdentifierName:
     IdentifierStartCharacterIdentifierContinueCharactersopt
     ' SingleQuotedIdentifier'

   IdentifierStartCharacter:
     LetterCharacter
    _

   IdentifierContinueCharacter:
     IdentifierStartCharacter
     DecimalDigitCharacter
     ConnectingCharacter
     CombiningCharacter
     FormattingCharacter

   IdentifierContinueCharacters:
     IdentifierContinueCharacterIdentifierContinueCharactersopt

   LetterCharacter:
    dowolny znak Unicode klasy Wielkie litery (Lu) lub Małe litery (Ll)
    dowolny znak Unicode z klasy Jak nazwy własne (Lt)
    dowolny znak Unicode klasy Modyfikator litery (Lm) lub Inne litery (Lo)
    dowolny znak Unicode z klasy Liczba litera (Nl)

   CombiningCharacter:
    dowolny znak Unicode klasy Znak bez odstępów (Mn) lub Znak łączący odstępy (Mc)

   DecimalDigitCharacter:
    dowolny znak Unicode klasy Liczba dziesiętna (Nd)

   ConnectingCharacter:
    dowolny znak Unicode klasy Łącznik interpunkcji (Pc)

   FormattingCharacter:
    dowolny znak Unicode klasy Format (Cf)

Identyfikatory w formie cudzysłowów pojedynczych

Element identyfikator-w-pojedynczym-cudzysłowie może służyć do zezwalania na użycie jako identyfikator dowolnej sekwencji zawierającej zero lub więcej znaków Unicode, co obejmuje słowa kluczowe, białe znaki, komentarze i operatory. Pojedyncze znaki cudzysłowu są obsługiwane z sekwencją dwóch cudzysłowów.

   SingleQuotedIdentifier:
     SingleQuotedIdentifierCharacters

   SingleQuotedIdentifierCharacters:
     SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt

   SingleQuotedIdentifierCharacter:
     TextCharactersNoSingleQuote
     SingleQuoteEscapeSequence

   TextCharactersNoSingleQuote:
    Dowolny znak Unicode z wyjątkiem ' (U+0027)

   SingleQuoteEscapeSequence:
    ''

Jednoznaczny identyfikator

   DisambiguatedIdentifier:
     TableColumnIdentifier
     GlobalIdentifier

   TableColumnIdentifier:
     Identifier[@Identifier]

   GlobalIdentifier:
     [@ Identifier]

Słowa kluczowe w kontekście

   ContextKeyword:
    Parent
    Self
    ThisItem
    ThisRecord

Uwzględnij wielkość liter

Power Apps rozróżnia wielkość liter w identyfikatorach. Narzędzie do tworzenia automatycznie zamieni je na odpowiedni rozmiar w trakcie pisania formuły.

Separatory

   DecimalSeparator:
     . (kropka) w językach, które używają kropki jako separatora liczb dziesiętnych, na przykład 1.23
     , (przecinek) dla języka, który używa kropki jako separatora liczb dziesiętnych, na przykład 1,23

   ListSeparator:
     , (przecinek) jeśli DecimalSeparator to . (dot)
     ; (średnik), jeśli DecimalSeparator is , (przecinek)

   ChainingSeparator:
     ; (średnik) if DecimalSeparator jest . (kropka)
     ;; (podwójny średnik), jeśli separatorem dziesiętnym jest , (przecinek)

Operatory

Operatory są używane w formułach w celu opisywania operacji obejmujących co najmniej jeden operand. Na przykład wyrażenie a + b używa operatora +, aby dodać dwa operandy a i b.

   Operator:
     BinaryOperator
     BinaryOperatorRequiresWhitespace
     PrefixOperator
     PrefixOperatorRequiresWhitespace
     PostfixOperator

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

   BinaryOperatorRequiresWhitespace:
     And Whitespace
     Or Whitespace

   PrefixOperator:
    !

   PrefixOperatorRequiresWhitespace:
     Not Whitespace

   PostfixOperator:
    %

Operator odnośnika

   ReferenceOperator:jeden z
    .!

Odwołanie do obiektu

   Reference:
     BaseReference
     BaseReferenceReferenceOperatorReferenceList

   BaseReference:
     Identifier
     DisambiguatedIdentifier
     ContextKeyword

   ReferenceList:
     Identifier
     IdentifierReferenceOperatorReferenceList

Rekord inline

   InlineRecord:
     { InlineRecordListopt}

   InlineRecordList:
     Identifier:Expression
     Identifier:ExpressionListSeparatorInlineRecordList

Tabela inline

   InlineTable:
     [ InlineTableListopt]

   InlineTableList:
     Expression
     ExpressionListSeparatorInlineTableList

Expression

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

Wyrażenia łączone

   ChainedExpression:
     Expression
     ExpressionChainingSeparatorChainedExpressionopt

Wywoływanie funkcji

   FunctionCall:
     FunctionIdentifier(FunctionArgumentsopt)

   FunctionIdentifier:
     Identifier
     Identifier.FunctionIdentifier

   FunctionArguments:
     ChainedExpression
     ChainedExpressionListSeparatorFunctionArguments