Граматика виразу
Нотатка
Microsoft Power Fx — це нова назва мови формул для компонованих програм. Робота над цим циклом статей триває, оскільки ми поступово виокремлюємо згадану мову з компонованих програм, інтегруємо її з іншими продуктами Microsoft Power Platform і робимо відповідний код відкритим. Почніть знайомство з мовою формул з огляду Microsoft Power Fx.
Microsoft Power Fx має в своїй основі формули, які зв'язують імена із виразами. Так само, як і в аркушах Excel, при змінах у вхідних залежностях для виразу цей вираз повторно обчислюється, і значення для імені змінюється, також, можливо, викликаючи каскадні зміни у інших формулах.
Ця граматика містить частину виразу формули. Зв’язування з іменем для створення формули залежить від інтегрованого компонента Power Fx. В аркушах синтаксис зв’язування не є явним, він визначається тим розташуванням, де вказано формулу, наприклад, при введені значення =B1
в клітинку A1. У деяких випадках зв’язування не потрібно, і Power Fx використовується як оцінювач виразу, наприклад, для підтримки обчислюваних стовпців таблиці бази даних. Для Power Apps зв'язування визначається при роботі у Power Apps Studio із використанням формату серіалізації на основі YAML для використання поза межами Power Apps Studio.
Граматичні умовні позначення
Лексична та синтаксична граматики представлені використанням граматичних конструкцій. Кожне граматичне виробництво визначає нетермінальний символ і можливі розширення цього нетермінального символу у послідовності нетермінальних або термінальних символів. У граматичних виробництвах нетермінальні символи позначаються курсивом, а термінальні — шрифтом із фіксованою шириною.
Перший рядок граматичної виробництва — це назва нетермінального символу, за яким іде дві крапки. Кожен рядок із відступом наступного порядку може містити розширення незавершального символу, яке вказується у вигляді послідовності незавершальних або завершальних символів. Наприклад, робоче середовище:
Глобальний ідентифікатор:
[@
Ідентифікатор]
визначає GlobalIdentifier таким, що складається з маркера [@
, за яким іде Ідентифікатор, за яким іде маркер ]
.
Якщо існує кілька можливих розширень нетермінального символу, альтернативні варіанти перелічені в окремих рядках. Нижній індекс «opt» використовується для позначення необов'язкових символів. Наприклад, робоче середовище:
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
скорочено для:
FunctionCall:
Ідентифікатор функції (FunctionIdentifier)(
)
FunctionIdentifier(
FunctionArguments)
Альтернативи зазвичай перелічуються в окремих рядках, проте в тих випадках, коли існує багато альтернатив, фраза «один з» може передувати списку розширень, наведених в одному рядку. Це просто скорочення, яке використовується замість перелічення всіх альтернативних елементів в окремих рядках.
Наприклад, робоче середовище:
Десяткова цифра: одна з
0
1
2
3
4
5
6
7
8
9
скорочено для:
Десяткова цифра:
0
1
2
3
4
5
6
7
8
9
Лексичний аналіз
Продукція лексичної одиниці визначає лексичну граматику для виразу Power Fx. Кожний припустимий вираз Power Fx відповідає цій граматиці.
Одиниця виміру:
ExpressionElementsopt
Елементи виразу:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Прогалин
Коментар
На лексичному рівні вираз Power Fx складається з потоку Пробілів, Приміток і Маркерів. Кожна така продукція наведена у розділах нижче. Для синтаксичної граматики важливими є лише елементи Маркера.
Пробіл
Пробіл використовується для розділення приміток і маркерів у документі Power Apps.
Пробіли:
будь-який розділювач Юнікод (клас Zs)
будь-який розділювач рядків Юнікод (клас Zl)
будь-який розділювач абзаців Юнікод (клас Zp)
Символ горизонтальної вкладки (U+0009)
Символ переведення рядка (U+000A)
Символ вертикальної табуляції (U+000B)
Символ переведення формату (U+000C)
Символ повернення каретки (U+000D)
Символ нового рядка (U+0085)
Коментарі
Підтримуються дві форми приміток:
- Однорядкові коментарі, які починаються з символів
//
і продовжуються до кінця поточного рядка. - Багаторядкові коментарі, які починаються з символів
/*
і закінчуються символами*/
. Багаторядкові коментарі можуть займати кілька рядків.
Коментар:
РозмежованийКоментар
SingleLineComment
SingleLineКоментар:
//
SingleLineCommentCharactersвибрати
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterSingleLineCommentCharacteropt
SingleLineCommentCharacter:
будь-які символи Unicode, крім NewLineCharacter
Коментар:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
DelimitedCommentCharactersNoAsteriskDelimitedCommentCharacteropt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharacteropt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentCharactersNoAsterisk:
будь-який символ Юнікод, за винятком * (зірочка)
DelimitedCommentNoSlashAsteriskCharacter:
будь-який символ Юнікод, за винятком / (скісна риска) або * (зірочка)
Коментарі не вкладаються один до одного. Послідовності символів /*
і */
не мають спеціального значення в межах однорядкового коментаря, а послідовності символів //
і /*
не мають спеціального значення у межах багаторядкового коментаря.
Коментарі не обробляються в текстово-літеральних рядках.
У наведеному нижче прикладі містяться дві багаторядкові примітки.
/* 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
DecimalDigitsDecimalDiparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
Десяткові цифри:
Десяткова цифра
Десяткові цифриДесяткові цифри
Десяткова цифра: одна з
0
1
2
3
4
5
6
7
8
9
Експонентна частина:
ЗнакExponentIndicatorопціонDecimalDigits
Показник експоненти:один з
e
E
Текстові літерали
Текстовий літерал використовується для запису послідовності символів у форматі Юнікод і отримання текстового значення. Текстові літерали зазначаються у подвійних лапках. Щоб включити до текстового значення подвійні лапки, повторіть подвійні лапки, як показано в наведеному нижче прикладі.
"The ""quoted"" text" // The "quoted" text
TextLiteral:
"
TextLiteralCharactersвибрати"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharacteropt
TextLiteralCharacter:
TextCharacterNoDoubleQuote
DoubleQuoteEscape Sequence
TextCharacterNoDoubleQuote:
будь-яка точка коду Юнікод крім подвійних лапок
DoubleQuoteEscapeSequence:
"
"
Identifiers
Ідентифікатор — це ім'я, що використовується для посилання на значення. Ідентифікаторами можуть бути звичайні ідентифікатори або ідентифікатори в одинарних лапках.
Ідентифікатор:
IdentifierName, аленеOperatorабоContextKeyword
Ім'я ідентифікатора:
IdentifierStartCharacterIdentifierContinueCharacteropt
'
SingleQuotedIdentifier'
IdentifierStartCharacter:
Літерний символ
_
ІдентифікаторContinueCharacter:
IdentifierStartCharacter
Символ десяткового розряду
Сполучний характер
Комбінування персонажів
ФорматуванняСимвол
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharacteropt
Літерний характер:
будь-який символ Юнікод класу Велика літера (Lu) або Мала літера (Ll)
будь-який символ Юнікод класу Літера заголовка (Lt)
будь-який символ Юнікод класу Модифікатор літер (Lm) або Інші літери (Lo)
будь-який символ Юнікод з класу Літера-число (Nl)
Комбінуючий характер:
будь-який символ Юнікод класу Нерозривна позначка (Mn) або Позначка комбінованого інтервалу (Mc)
Символ десяткового розряду:
будь-який символ Юнікод класу Десяткова цифра (Nd)
З’єднувальний характер:
будь-який символ Юнікод класу З’єднуюча пунктуація (Pc)
Форматування символу:
будь-який символ Юнікод класу Форматування (Cf)
Ідентифікатори в одинарних лапках
Ідентифікатор в одинарних лапках може містити будь-яку послідовність символів Юнікод, які будуть використовуватися як ідентифікатор, включно з ключовими словами, пробілами, коментарями та операторами. Щоб використати символ одинарних лапок, екрануйте його іншим символом одинарних лапок ('').
SingleQuotedIdentifier:
SingleQuotedIdentifierСимволи
SingleQuotedIdentifierСимволи:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharacteropt
SingleQuotedIdentifierCharacter:
TextCharactersNoSingleQuote
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
будь-який символ Юнікод, за винятком ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Однозначний ідентифікатор
DisambiguatedIdentifier:
Ідентифікатор TableColumnIdentifier
Глобальний ідентифікатор
Ідентифікатор стовпця:
Ідентифікатор ідентифікатора[@
...]
Глобальний ідентифікатор:
[@
Ідентифікатор]
Ключові слова з контексту
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
З урахуванням регістру
У ідентифікаторах Power Apps враховується регістр. При написанні формули засіб створення автоматично встановить для них правильний регістр.
Роздільники
Роздільник десяткових дробів:
.
(крапка) для мов, які використовують крапку як роздільник для десяткових чисел, наприклад 1.23
,
(кома) для мов, які використовують кому як роздільник для десяткових чисел, наприклад 1,23
ListSeparator:
,
(кома), якщо DecimalSeparator is ( .
крапка)
;
(крапка з комою), якщо DecimalSeparator дорівнює ( ,
кома)
Роздільник ланцюга:
;
(крапка з комою), якщо DecimalSeparator is ( .
крапка)
;;
(подвійна крапка з комою), якщо DecimalSeparator дорівнює ,
(кома)
Оператори
Оператори використовуються у формулах для опису операцій із одним або операндами. Наприклад, вираз a + b
використовує оператор +
для додавання дох операндівa
і b
.
Оператор:
BinaryOperator (Бінарний оператор)
BinaryOperatorВимагає пробілу
PrefixOperator (Оператор префікса)
PrefixOperatorВимагає пробілу
PostfixOperator
BinaryOperator:один з
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorВимагаєПробіл:
And
Прогалин
Or
Прогалин
PrefixOperatorВимагаєПробіл:
Not
Прогалин
Оператор посилання
Посилання на об'єкт
Посилання:
Базова довідка
Список посилань BaseReferenceOperator...
Посилання на основу:
Ідентифікатор
DisambiguatedIdentifier
ContextKeyword
Список використаної літератури:
Ідентифікатор
Список посилань оператора IdentifierReferenceList...
Вбудований запис
InlineRecord:
{
InlineRecordListopt}
InlineRecordList:
Вираз ідентифікатора:
...
Identifier:
ExpressionListSeparatorInlineRecordList
Вкладена таблиця
InlineTable:
[
InlineTableListopt]
InlineTableList:
Вираз
ExpressionListSeparatorInlineTableList
Expression
Вираз:
Буквальне
Посилання
Вбудований запис
Вбудована таблиця
Виклик функцій
(
Вираз)
Вираз PrefixOperator...
ВиразPostfixOperator
ВиразBinaryOperatorВираз
Раціональні вирази
ChainedExpression:
Вираз
ExpressionChainingSeparatorChainedExpressionopt
Виклик функції
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
Ідентифікатор функції:
Ідентифікатор
Ідентифікатор.
FunctionIdentifier
Аргументи функції:
Ланцюговий вираз
ChainedExpressionListSeparatorFunctionArguments