Граматика на израза
Бележка
Microsoft Power Fx е новото име за езика на формулите за приложения на платното. Тези статии са в процес на разработка, тъй като извличаме езика от приложенията на платното и го интегрираме с други продукти на Microsoft Power Platform и го направете достъпен като отворен код. Започнете с общ преглед на Microsoft Power Fx за въведение в езика.
Microsoft Power Fx се основава на формули, които обвързват име с израз. Точно както в работните листове на Excel, тъй като входящите зависимости към промяната на израза, изразът се преизчислява и стойността на името се променя, евентуално каскадно преизчисляване в други формули.
Тази граматика обхваща изразната част на формулата. Обвързването с име за създаване на формула зависи от начина на интегриране на Power Fx. В работни листове синтаксисът на обвързване не е изложен, това се подразбира от местоположението, където е записан изразът, например въвеждане на =B1
в клетка А1. В някои случаи изобщо не се изисква обвързване и Power Fx се използва като оценител на изрази, например при поддържане на изчислени колони от таблица на базата данни. За Power Apps обвързването се подразбира при работа в Power Apps Studio с формат за сериализация, базиран на YAML за използване извън Power Apps Studio.
Граматични конвенции
Лексикалните и синтактичните граматики са представени чрез използване на граматични продукции. Всяка граматична продукция дефинира нетерминален символ и възможните разширения на този нетерминален символ в поредици от нетерминални или терминални символи. В граматичните продукции нетерминалните символи са показани в курсив, а терминалните символи са показани с шрифт с фиксирана ширина.
Първият ред на граматичната продукция е името на нетерминалния символ, който се дефинира, последвано от двоеточие. Всеки последователен отстъпен ред съдържа възможно разширение на нетерминалния символ, даден като последователност от нетерминални или терминални символи. Например продукцията:
Глобален идентификатор:
[@
Идентификатор]
определя GlobalIdentifier да се състои от маркер [@
, последван от Идентификатор, последван от маркер ]
.
Когато има повече от едно възможно разширяване на нетерминален символ, алтернативите са изброени на отделни редове. Индексът "opt" се използва за обозначаване на незадължителен символ. Например продукцията:
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
е стенография за:
FunctionCall:
FunctionIdentifier(
)
FunctionIdentifier(
FunctionArguments)
Алтернативите обикновено са изброени на отделни редове, макар че в случаите, когато има много алтернативи, фразата "един от" може да предшества списък с разширения, дадени на един ред. Това е просто стенография за изброяване на всяка от алтернативите на отделни редове.
Например продукцията:
DecimalDigit: едно от
0
1
2
3
4
5
6
7
8
9
е стенография за:
DecimalDigit:
0
1
2
3
4
5
6
7
8
9
Лексикален анализ
Производството на лексикални единици дефинира лексикалната граматика за израз на Power Fx. Всеки валиден израз на Power Fx съответства на тази граматика.
Единица за изразяване:
ExpressionElementsopt
ExpressionElements:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Празно
Коментирам
На лексикално ниво изразът Power Fx се състои от поток от елементите Whitespace, Comment и Token. Всяка от тези продукции е разгледана в следващите раздели. Само елементите маркер са значими в синтактичната граматика.
Интервал
Пробелът се използва за разделяне на коментари и символи в рамките на Power Apps документ.
Празно пространство:
който и да е разделител за интервал на Unicode (клас Zs)
който и да е разделител за ред на Unicode (клас Zl)
всеки разделител на параграф на Unicode (клас Zp)
Символ за хоризонтален раздел (U+0009)
Символ за редово подаване (U+000A)
Символ за вертикален раздел (U+000B)
Символ за подаване на формуляр (U+000C)
Символ за нов ред (U+000D)
Символ за следващ ред (U+0085)
Коментари
Поддържат се две форми на коментари:
- Едноредови коментари, които започват с символите
//
и се простират до края на изходния ред. - Разграничени коментари, които започват с символите
/*
и завършва с символите*/
. Разграничените коментари могат да обхващат няколко реда.
Коментар:
ДелимитиранКоментар
Едноредов коментар
SingleLineКоментар:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
Символ за коментар на един ред
SingleLineCommentCharacterSingleLineCommentCharactersopt
Символ на SingleLineComment:
всички символи на Unicode с изключение на NewLineCharacter
ДелимитиранКоментар:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
ДелимитиранКоментарЗнациБез ЗвездичкаРазделителКоментарЗнаци
*
С ограничениеКоментарСледЗвездичкаЗнаци
DelimitedCommentAfterAsteriskCharacters:
С ограничениеКоментарНеНаклонена чертаЗвездичкаЗнакс ограничениеКоментарИзбор на знаци
*
С ограничениеКоментарСледЗвездичкаЗнаци
РазделенКоментарЗнациБез звездичка:
всеки символ на Unicode с изключение на * (звездичка)
Ограничен коментарNoSlashAsteriskCharacter:
всеки символ на Unicode с изключение на / (наклонена черта) или * (звездичка)
Коментарите не са вложени. Последователностите на знаците /*
и */
нямат специално значение в рамките на едноредов коментар и последователностите от символи //
и /*
нямат специално значение в рамките на разграничен-коментар.
Коментарите не се обработват в текстови низове.
Следващият пример включва два разделителни коментара:
/* Hello, world
*/
"Hello, world" /* This is an example of a text literal */
Следните примери включват три едноредови коментара:
// Hello, world
//
"Hello, world" // This is an example of a text literal
Литерали
Литералът е представяне на изходен код на стойност.
Буквално:
Логически литерал
ЧислоЛитерал
ТекстЛитерал
Логически литерали
Логически литерал се използва за записване на стойностите true и false и създаване на логическа стойност.
LogicalLiteral:едно от
true
false
Числови литерали
Числов литерал се използва за записване на числова стойност и генериране на числова стойност.
ЧислоЛитерал:
DecimalDigitsExponentPartopt
DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
Десетични цифри:
Десетична цифра
DecimalDigitsDecimalDigit
DecimalDigit: едно от
0
1
2
3
4
5
6
7
8
9
ЕкспонентаЧаст:
Знак за избор на ExponentIndicator...DecimalDigits
ExponentIndicator: един от
e
E
Текстови литерали
Текстов литерал се използва за записване на последователност от Unicode символи и създаване на текстова стойност. Текстовите литерали са затворени в двойни кавички. За да включите двойни кавички в текстовата стойност, повторете двойните кавички, както е показано в следния пример:
"The ""quoted"" text" // The "quoted" text
ТекстЛитерал:
"
TextLiteralCharactersopt"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharactersopt
TextLiteralCharacter:
ТекстХарактерНеДвойно цитиране
Двойна QuoteEscapeSequence
ТекстХарактерNoDoubleQuote:
всяка точка на код на Unicode с изключение на двойна кавичка
Двойна QuoteEscapeSequence:
"
"
Идентификатори
Идентификаторът е име, използвано за препратка към стойност. Идентификаторите могат да бъдат или регулярни идентификатори, или идентификатори с единична кавичка.
Идентификатор:
IdentifierName, нонеOperatorилиContextKeyword
Име на идентификатора:
ИдентификаторНачаленИдентификатор на символиПродължаванеЗнаци...опция
'
SingleQuotedIdentifier'
ИдентификаторНачален знак:
БукваСимвол
_
IdentifierContinueCharacter:
ИдентификаторНачален знак
Десетичен знакЦифра
Свързващ характер
КомбиниранеХарактер
ФорматиранеСимвол
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharactersopt
БукваХарактер:
всеки Unicode символ на класа Uppercase letter (Lu) или Lowercase letter (Ll)
всеки Unicode знак на заглавната Titlecase letter (Lt)
всеки Unicode символ на класа Letter modifier (Lm) или Letter other (Lo)
всеки Unicode знак на класа Number letter (Lt)
Комбиниране на характер:
всеки Unicode символ на класа Non-spacing mark (Mn) или Spacing combining mark (Mc)
DecimalDigitCharacter:
всеки Unicode знак от класа Decimal digit (Nd)
Свързващ характер:
всеки Unicode знак от препинателните знаци на класа Connector punctuation (Pc)
FormattingCharacter:
всеки Unicode знак от класа Format (Cf)
Идентификатори с единични кавички
Единичен цитиран идентификатор може да съдържа всяка последователност от Unicode символи, които да се използват като идентификатор, включително ключови думи, интервали, коментари и оператори. Единичните кавички се поддържат с екранираща последователност от две единични кавички.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt
SingleQuotedIdentifierCharacter:
ТекстЗнациНеЕдиничен цитат
SingleQuoteEscapeSequence
ТекстСимволиNoSingleQuote:
всеки символ на Unicode с изключение на ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Неопределен идентификатор
DisambiguatedIdentifier:
TableColumnIdentifier
Глобален идентификатор
TableColumnIdentifier:
Идентификатор[@
на идентификатора]
Глобален идентификатор:
[@
Идентификатор]
Контекстни ключови думи
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
Чувствителност за малки и главни букви
Power Apps идентификаторите са чувствителни към малки и големи букви. Инструментът за авторство автоматично ще ги промени в правилния случай, когато се пише формула.
Разделители
Десетичен разделител:
.
(точка) за езици, които използват точка като разделител за десетични числа, например 1.23
,
(запетая) за езици, които използват запетая като разделител за десетични числа, например 1,23
Разделител на списъци:
,
(запетая), ако DecimalSeparator е .
(точка)
;
(точка и запетая), ако DecimalSeparator е ,
(запетая)
Верижен сепаратор:
;
(точка и запетая), ако DecimalSeparator е .
(точка)
;;
(двойна точка и запетая), ако DecimalSeparator е ,
(запетая)
Оператори
Операторите се използват във формули за описване на операции, включващи един или повече операнди. Например изразът a + b
използва +
оператор, за да добавите двата операнда a
и b
.
Оператор:
Двоичен оператор
BinaryOperatorRequiresWhitespace
PrefixOperator
PrefixOperatorRequiresWhitespace
PostfixOperator
BinaryOperator:едно от
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Празно
Or
Празно
PrefixOperatorRequiresWhitespace:
Not
Празно
Референтен оператор
Препратка към обект
Препратка:
Базова справка
BaseReferenceReferenceOperatorReferenceList
Базова препратка:
Идентификатор
Недвусмислен идентификатор
КонтекстКлючова дума
Списък с препратки:
Идентификатор
ИдентификаторReferenceOperatorReferenceList
Вграден запис
Вграден запис:
{
Опция за InlineRecordList}
InlineRecordList:
Идентификаторен:
израз
Списък с идентификаторни:
изрази...InlineRecordList
Вградена таблица
Вградена таблица:
[
Опция за InlineTableList]
InlineTableList:
Изразяване
ExpressionListSeparatorInlineTableList
Expression
Изразяване:
Буквален
Препратка
Вграден запис
Вградена таблица
FunctionCall
(
Изразяване)
Израз PrefixOperator...
ИзразPostfixOperator
ИзразBinaryOperatorExpression
Верижни изрази
Верижен израз:
Изразяване
ExpressionChainingSeparatorChainedExpressionopt
Извикване на функция
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
FunctionIdentifier:
Идентификатор
Идентификатор.
FunctionIdentifier
FunctionArguments:
Верижен израз
ChainedExpressionListSeparatorFunctionArguments