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
0
1
2
3
4
5
6
7
8
9
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
true
false
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
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
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
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Whitespace
Or
Whitespace
PrefixOperatorRequiresWhitespace:
Not
Whitespace
Operator odnośnika
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