Грамматика выражений
Заметка
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 как состоящий из токена [@
, за которым следует Идентификатор, за которым следует токен ]
.
При наличии более одного возможного расширения неконечного символа альтернативные варианты перечисляются в разных строках. Подстрочный индекс "необязательно" используется для указания необязательного символа. Например, следующее правило:
Вызов функции:
ИдентификаторФункции(
АргументыФункциинеобязательный)
является сокращенным вариантом следующего:
Вызов функции:
ИдентификаторФункции(
)
ИдентификаторФункции(
АргументыФункции)
Альтернативные варианты обычно перечисляются в отдельных строках, но в тех случаях, когда существует много альтернатив, списку расширений, заданных в одной строке, может предшествовать фраза "один из". Это простое сокращение для перечисления всех альтернативных вариантов в отдельных строках.
Например, следующее правило:
ДесятичнаяЦифра:один из
0
1
2
3
4
5
6
7
8
9
является сокращенным вариантом следующего:
ДесятичнаяЦифра:
0
1
2
3
4
5
6
7
8
9
Лексический анализ
Лексическая-единица определяет лексическую грамматику для выражения Power Fx. Каждое допустимое выражение Power Fx соответствует этой грамматике.
ExpressionUnit:
ExpressionElementsнеобходимо
ЭлементыВыражения:
ExpressionElement
ExpressionElementЭлементы Expressionopt
ЭлементВыражения:
Пробелы
Комментарий
На лексическом уровне выражение Power Fx состоит из потока элементов Пробел, Комментарий и Токен. Каждое из этих правил описываются в следующих разделах. В синтаксической грамматике учитываются только элементы Токен.
Пробел
Пробелы используются для разделения комментариев и токенов в документе Power Apps.
Пробелы:
любой разделитель пробелов Unicode (класс Zs)
любой разделитель строк Unicode (класс Zl)
любой разделитель абзацев Unicode (класс Zp)
Символ горизонтальной табуляции (U+0009)
Символ перевода строки (U+000A)
Символ вертикальной табуляции (U+000B)
Символ перевода страницы (U+000C)
Символ возврата каретки (U+000D)
Символ следующей строки (U+0085)
Комментарии
Поддерживаются две формы комментариев:
- Однострочные комментарии, которые начинаются с символов
//
и продолжаются до конца исходной строки. - Комментарии с разделителями, которые начинаются с символов
/*
и заканчиваются символами*/
. Комментарии с разделителями могут включать несколько строк.
Комментарий:
РазделенныйКомментарий
SingleLineКомментарий
Однострочный комментарий:
//
SingleLineCommentCharactersнеобязательный
Символы однострочного комментария:
ОднострочныйКомментарийСимвол
SingleLineCommentCharacterSingleLineCommentCharactersopt
ОднострочныйКомментарийСимвол:
любые символы Unicode, кроме NewLineCharacter
РазделенныйКомментарий:
/*
РазделенныеКомментарииСимволынеобязательно*/
Разделенные символы комментария:
Разделенные символы комментарияБез звездочкиРазделенные символы комментариянеобязательно
*
РазделенныеКомментарииПослеЗвездочкиСимволы
РазделенныеКомментарииПослеЗвездочкиСимволы:
РазделенныеКомментарииБезКосой чертыСимвол звездочкиРазделенныеКомментарииСимволынеобязательно
*
РазделенныеКомментарииПослеЗвездочкиСимволы
РазделенныеКомментарииСимволыБезЗвездочки:
любой символ Unicode, кроме * (звездочка)
РазделенныйКомментарийБезКосой чертыСимвол звездочки:
любой символ 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
Числовые литералы
Числовой литерал используется для записи числового значения и дает числовое значение.
ЧисловойЛитерал:
ДесятичныеЦифрыЭкспоненциальнаяЧастьнеобязательный
ДесятичныеЦифрыДесятичныйРазделительДесятичныеЦифрынеобязательныйЭкспоненциальнаяЧастьнеобязательный
ДесятичныйРазделительДесятичныеЦифрыЭкспоненциальнаяЧастьнеобязательный
ДесятичныеЦифры:
ДесятичнаяЦифра
ДесятичныеЦифрыДесятичнаяЦифра
ДесятичнаяЦифра:один из
0
1
2
3
4
5
6
7
8
9
ЭкспоненциальнаяЧасть:
Индикатор степениЗнакнеобязательныйДесятичные цифры
Текстовые литералы
Текстовый литерал используется для записи последовательности символов Юникода и создает текстовое значение. Текстовые литералы заключены в двойные кавычки. Чтобы включить двойные кавычки в текстовое значение, повторите двойные кавычки, как показано в следующем примере:
"The ""quoted"" text" // The "quoted" text
ТекстовыйЛитерал:
"
ТекстовыеЛитеральныеСимволынеобязательный"
ТекстовыеЛитеральныеСимволы:
TextLiteralCharacterTextLiteralCharactersopt
ТекстовыйЛитералСимвол:
ТекстСимволБезДвойнойКавычки
DoubleQuoteEscapeSequence
ТекстСимволБезДвойнойКавычки:
любая точка кода Unicode, кроме двойной кавычки
DoubleQuoteEscapeSequence:
"
"
Identifiers
Идентификатор — это имя, используемое для ссылки на значение. Идентификаторы могут быть либо обычными идентификаторами, либо идентификаторами с одинарными кавычками.
Идентификатор:
Имя идентификаторанонеоператорилиContextKeyword
ИмяИдентификатора:
ИдентификаторНачальныйСимволИдентификаторПродолжитьСимволынеобязательно
'
SingleQuotedIdentifier'
ИдентификаторНачальногоСимвола:
БукваСимвол
_
ИдентификаторПродолжитьСимвол:
ИдентификаторНачальныйСимвол
ДесятичнаяЦифраСимвол
Связующий персонаж
КомбинированиеХарактер
ФорматированиеСимвола
ИдентификаторПродолжитьСимволы:
ИдентификаторПродолжитьСимволИдентификаторПродолжитьСимволынеобязательно
БукваСимвол:
любой символ Unicode класса Заглавная буква (Lu) или Строчная буква (Ll)
любой символ Unicode класса Буква заголовка (Lt)
любой символ Unicode класса Модификатор буквы (Lm) или Прочая буква (Lo)
любой символ Unicode класса Буква цифры (Nl)
КомбинируемыйСимвол:
любой символ Unicode класса Непробельный символ (Mn) или Символ ненулевой ширины (Mc)
ДесятичнаяЦифраСимвол:
любой символ Unicode класса Десятичная цифра (Nd)
СоединительныйСимвол:
любой символ Unicode класса соединительной пунктуации (Pc)
ФорматированиеСимвола:
любой символ Unicode класса формата (Cf)
Идентификаторы в одинарных кавычках
Один нестандартный идентификатор может содержать любую последовательность символов Юникода в качестве идентификатора, включая ключевые слова, пробелы, комментарии и операторы. Одинарные кавычки поддерживаются с escape-последовательностью из двух одинарных кавычек.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
Символы идентификатора в одиночных кавычках:
Символ идентификатора в одиночных кавычкахСимволы идентификатора в одиночных кавычкахнеобязательно
СимволИдентификатораОднократныхКавычек:
ТекстСимволыБезОдиночнойЦитаты
SingleQuoteEscapeSequence
СимволыТекстаБезОдиночнойЦитаты:
любой символ Юникода, кроме ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Однозначный идентификатор
РазрешенныйИдентификатор:
ИдентификаторТаблицыКолонки
ГлобальныйИдентификатор
ИдентификаторСтолбцаТаблицы:
Идентификатор[@
Идентификатор]
ГлобальныйИдентификатор:
[@
Идентификатор]
Ключевые слова контекста
КонтекстКлючевое слово:
Parent
Self
ThisItem
ThisRecord
Учет регистра
Идентификаторы Power Apps зависят от регистра. Средство разработки автоматически изменит их на правильный регистр при написании формулы.
Разделители
ДесятичныйРазделитель:
.
(точка) для языков, в которых точка используется в качестве разделителя десятичных чисел, например 1.23
,
(запятая) для языков, в которых запятая используется в качестве разделителя десятичных чисел, например 1,23
Разделитель списка:
,
(запятая) если ДесятичныйРазделитель равно .
(точка)
;
(точка с запятой) если ДесятичныйРазделитель равно ,
(запятая)
Разделитель цепочек:
;
(точка с запятой) если ДесятичныйРазделитель равно .
(точка)
;;
(двойная точка с запятой) если DecimalSeparator равно ,
(запятая)
Операторы
Операторы используются в формулах для описания операций, включающих один или несколько операндов. Например, выражение a + b
использует оператор +
для добавления двух операндов a
и b
.
оператор:
ДвоичныйОператор
ДвоичныйОператорТребуетПробелы
ПрефиксОператор
ПрефиксОператорТребуетсяПробел
PostfixOperator
BinaryOperator:один из
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
ДвоичныйОператорТребуетПробелы:
And
Пробелы
Or
Пробелы
ПрефиксОператорТребуетсяПробел:
Not
Пробелы
Оператор ссылки
Ссылка на объект
Ссылка:
Базовая ссылка
BaseReferenceReferenceOperatorReferenceList
Базовая ссылка:
Идентификатор
РазрешенныйИдентификатор
ContextKeyword
Список литературы:
Идентификатор
ИдентификаторОператор ссылокСписок ссылок
Встроенная запись
Встроенная запись:
{
InlineRecordListнеобязательный}
InlineRecordList:
Идентификатор:
Выражение
Идентификатор:
ВыражениеListSeparatorInlineRecordList
Встроенная таблица
Встроенная таблица:
[
InlineTableListнеобходимо]
ВстроенныйСписокТаблиц:
Выражение
ВыражениеРазделительСписковВстроенныйСписокТаблицы
Expression
Выражение:
Буквальный
Ссылка
InlineRecord
ВстроеннаяТаблица
ФункцияВызов
(
Выражение)
ПрефиксОператорВыражение
ВыражениеПостфиксный оператор
ВыражениеBinaryOperatorВыражение
Связанные выражения
СвязанноеВыражение:
Выражение
ВыражениеРазделитель цепочкиВыражение цепочкинеобязательный
Вызов функции
ФункцияВызов:
ИдентификаторФункции(
АргументыФункциинеобязательный)
Идентификатор функции:
Идентификатор
Идентификатор.
ИдентификаторФункции
Аргументы функции:
ChainedExpression
ChainedExpressionРазделительСписковАргументыФункции