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:

  Identyfikator globalny:
    [@Identyfikator]

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:

  Wywołanie funkcji:
    FunctionIdentifier(FunctionArgumentsopt)

to skrócona forma produkcji:

  Wywołanie funkcji:
    Identyfikator funkcji()
    FunctionIdentifier(Argumenty funkcji)

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:

  Cyfra dziesiętna:jedna z
    0123456789

to skrócona forma produkcji:

  Cyfra dziesiętna:
    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ą.

  Jednostka wyrażenia:
    Opcja ExpressionElements

  Elementy wyrażenia:
    Element wyrażenia
    ExpressionElementExpressionElementsopcjonalnie

  Element wyrażenia:
    Odstępu
    Komentarz

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.

  Białe znaki:
    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.

  Komentarz:
    Ograniczony komentarz
    Komentarz jednowierszowy

  Komentarz jednowierszowy:
    //SingleLineCommentCharactersopt

  SingleLineCommentCharacters:
    SingleLineCommentCharacter
    SingleLineCommentCharacterSingleLineCommentCharactersopt

  SingleLineCommentCharacter:
    wszelkie znaki Unicode poza znakiem NewLineCharacter

  Ograniczony komentarz:
    /*DelimitedCommentCharactersopt*/

  DelimitedCommentCharacters:
    DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
    *DelimitedCommentAfterAsteriskCharacters

  DelimitedCommentAfterAsteriskCharacters:
    OgranicznikKomentarzNoSlashGwiazdkaZnakOgraniczonyKomentarzZnakiopt
    *DelimitedCommentAfterAsteriskCharacters

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

  OgraniczonaKomentarzNoSlashGwiazdkaPostać:
    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.

  Dosłownie:
    Literał logiczny
    LiczbaLiterał
    TextLiteral (Literał tekstowy)

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ą.

  LiczbaLiterał:
    Cyfry dziesiętne Wykładnik...Część opt
    Cyfrydziesiętne SeparatorCyfrydziesiętne wybierzWykładnikCzęśćopt
    SeparatordziesiętnyCyfrydziesiętne WykładnikCzęśćopt

  Cyfry dziesiętne:
    Cyfra dziesiętna
    Cyfry dziesiętne Cyfradziesiętna

  Cyfra dziesiętna:jedna z
    0123456789

  Część wykładnicza:
    ZnakwykładnikaoptDecimalDigits

  Wykładnik:jeden z
    eE

  Znak: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:
    TextLiteralCharacterTextLiteralCharactersopcjonalnie

  TextLiteralCharacter:
    TextCharacterNoDoubleQuote
    DoubleQuoteEscapeSequence (Sekwencja ucieczki DoubleQuote)

  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.

  Identyfikator:
    IdentifierName,alenieOperatoraniContextKeyword

  IdentyfikatorNazwa:
    IdentifierStartCharacterIdentifierContinueCharactersopt
    'SingleQuotedIdentifier (Identyfikator pojedynczego cytatu)'

  IdentifierStartCharacter:
    Znak litery
    _

  IdentifierContinueCharacter:
    IdentifierStartCharacter (IdentyfikatorZnak_startowy)
    Cyfra dziesiętna
    Łącznik Character
    Łączenie postaci
    FormattingCharacter (FormatowanieZnak)

  IdentifierContinueCharacters:
    IdentifierContinueCharacterIdentifierContinueCharactersopt

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

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

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

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

  Formatowanie znaku:
    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)

  SingleQuotedIdentifierCharacters:
    SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopcjonalnie

  SingleQuotedIdentifierCharacter:
    TextCharactersNoSingleQuote
    SingleQuoteEscapeSequence (Sekwencja ucieczki)

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

  SingleQuoteEscapeSequence:
    ''

Jednoznaczny identyfikator

  DisambiguatedIdentifier:
    Identyfikator kolumny tabeli
    Identyfikator globalny

  Identyfikator kolumny tabeli:
    Identyfikator[@Identyfikator]

  Identyfikator globalny:
    [@Identyfikator]

Słowa kluczowe w kontekście

  KontekstSłowo kluczowe:
    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

  Separator dziesiętny:
    . (kropka) dla języków, w których kropka jest separatorem liczb dziesiętnych, na przykład 1.23
    , (przecinek) w przypadku języków, w których separatorem liczb dziesiętnych jest przecinek. 1,23

  ListSeparator:
    , (przecinek), jeśli separator dziesiętny to . (kropka)
    ; (średnik), jeśli DecimalSeparator to , (przecinek)

  Separator łańcuchów:
    ; (średnik), jeśli DecimalSeparator to . (kropka)
    ;; (podwójny średnik), jeśli DecimalSeparator to , (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 (Operator prefiksu)
    PrefixOperatorRequiresWhitespace
    Operator przyrostka

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

  BinaryOperatorRequiresWhitespace:
    AndOdstępu
    OrOdstępu

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotOdstępu

  PostfixOperator:
    %

Operator odnośnika

  ReferenceOperator:jeden z
    .!

Odwołanie do obiektu

  Odniesienie:
    Odniesienie podstawowe
    BaseReferenceReferenceOperatorReferenceList

  Odniesienie podstawowe:
    Identyfikator
    DisambiguatedIdentifier (Identyfikator ujednoznaczniony)
    KontekstSłowo kluczowe

  Lista referencji:
    Identyfikator
    IdentyfikatorReferenceOperatorReferenceList

Rekord inline

  Rekord w tekście:
    {Opcja InlineRecordList}

  InlineRecordList:
    Wyrażenie identyfikatora:...
    Identifier:ExpressionListSeparatorInlineRecordList

Tabela inline

  Tabela wbudowana:
    [Opcja InlineTableList]

  InlineTableList:
    Wyrażenie
    ExpressionListSeparatorInlineTableList

Expression

  Wyrażenie:
    Dosłowny
    Odniesienie
    Rekord w tekście
    Tabela wbudowana
    Wywołanie funkcji
    (Wyrażenie)
    Wyrażenie PrefixOperator...
    WyrażeniePostfixOperator
    WyrażenieBinaryOperatorExpression

Wyrażenia łączone

  ChainedExpression:
    Wyrażenie
    WyrażenieChainingSeparatorChainedExpressionopt

Wywoływanie funkcji

  Wywołanie funkcji:
    FunctionIdentifier(FunctionArgumentsopt)

  Identyfikator funkcji:
    Identyfikator
    Identyfikator.FunctionIdentifier

  Argumenty funkcji:
    ChainedExpression (Wyrażenie łańcuchowe)
    ChainedExpressionListSeparatorFunctionArguments