Грамматика выражений
Заметка
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:
[@
Идентификатор]
определяет GlobalIdentifier как состоящий из токена [@
, за которым следует Идентификатор, за которым следует токен ]
.
При наличии более одного возможного расширения неконечного символа альтернативные варианты перечисляются в разных строках. Подстрочный индекс "необязательно" используется для указания необязательного символа. Например, следующее правило:
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 соответствует этой грамматике.
ExpressionUnit:
ExpressionElementsopt
ExpressionElements:
ExpressionElement
ExpressionElementExpressionElementsopt
ExpressionElement:
Пробел
Комментарий
На лексическом уровне выражение Power Fx состоит из потока элементов Пробел, Комментарий и Токен. Каждое из этих правил описываются в следующих разделах. В синтаксической грамматике учитываются только элементы Токен.
Пробел
Пробелы используются для разделения комментариев и токенов в документе Power Apps.
Пробел:
любой разделитель пробелов Unicode (класс Zs)
любой разделитель строк Unicode (класс Zl)
любой разделитель абзацев Unicode (класс Zp)
Символ горизонтальной табуляции (U+0009)
Символ перевода строки (U+000A)
Символ вертикальной табуляции (U+000B)
Символ перевода страницы (U+000C)
Символ возврата каретки (U+000D)
Символ следующей строки (U+0085)
Комментарии
Поддерживаются две формы комментариев:
- Однострочные комментарии, которые начинаются с символов
//
и продолжаются до конца исходной строки. - Комментарии с разделителями, которые начинаются с символов
/*
и заканчиваются символами*/
. Комментарии с разделителями могут включать несколько строк.
Комментарий:
DelimitedComment
SingleLineComment
SingleLineComment:
//
SingleLineCommentCharactersopt
SingleLineCommentCharacters:
SingleLineCommentCharacter
SingleLineCommentCharacterSingleLineCommentCharactersopt
SingleLineCommentCharacter:
любые символы Unicode, кроме NewLineCharacter
DelimitedComment:
/*
DelimitedCommentCharactersopt*/
DelimitedCommentCharacters:
DelimitedCommentCharactersNoAsteriskDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentAfterAsteriskCharacters:
DelimitedCommentNoSlashAsteriskCharacterDelimitedCommentCharactersopt
*
DelimitedCommentAfterAsteriskCharacters
DelimitedCommentCharactersNoAsterisk:
любой символ Unicode, кроме * (звездочка)
DelimitedCommentNoSlashAsteriskCharacter:
любой символ 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
Литералы
Литерал является представлением исходного кода значения.
Литерал:
LogicalLiteral
NumberLiteral
TextLiteral
Логические литералы
Логический литерал используется для записи значений "истина" и "ложь" и создает логическое значение.
LogicalLiteral:одно из следующего
true
false
Числовые литералы
Числовой литерал используется для записи числового значения и дает числовое значение.
NumberLiteral:
DecimalDigitsExponentPartopt
DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
DecimalSeparatorDecimalDigitsExponentPartopt
DecimalDigits:
DecimalDigit
DecimalDigitsDecimalDigit
DecimalDigit:одно из
0
1
2
3
4
5
6
7
8
9
ExponentPart:
ExponentIndicatorSignoptDecimalDigits
Текстовые литералы
Текстовый литерал используется для записи последовательности символов Юникода и создает текстовое значение. Текстовые литералы заключены в двойные кавычки. Чтобы включить двойные кавычки в текстовое значение, повторите двойные кавычки, как показано в следующем примере:
"The ""quoted"" text" // The "quoted" text
TextLiteral:
"
TextLiteralCharactersopt"
TextLiteralCharacters:
TextLiteralCharacterTextLiteralCharactersopt
TextLiteralCharacter:
TextCharacterNoDoubleQuote
DoubleQuoteEscapeSequence
TextCharacterNoDoubleQuote:
любая точка кода Unicode, кроме двойной кавычки
DoubleQuoteEscapeSequence:
"
"
Identifiers
Идентификатор — это имя, используемое для ссылки на значение. Идентификаторы могут быть либо обычными идентификаторами, либо идентификаторами с одинарными кавычками.
Идентификатор:
IdentifierNameнонеOperatorилиContextKeyword
IdentifierName:
IdentifierStartCharacterIdentifierContinueCharactersopt
'
SingleQuotedIdentifier'
IdentifierStartCharacter:
LetterCharacter
_
IdentifierContinueCharacter:
IdentifierStartCharacter
DecimalDigitCharacter
ConnectingCharacter
CombiningCharacter
FormattingCharacter
IdentifierContinueCharacters:
IdentifierContinueCharacterIdentifierContinueCharactersopt
LetterCharacter:
любой символ Unicode класса Заглавная буква (Lu) или Строчная буква (Ll)
любой символ Unicode класса Буква заголовка (Lt)
любой символ Unicode класса Модификатор буквы (Lm) или Прочая буква (Lo)
любой символ Unicode класса Буква цифры (Nl)
CombiningCharacter:
любой символ Unicode класса Непробельный символ (Mn) или Символ ненулевой ширины (Mc)
DecimalDigitCharacter:
любой символ Unicode класса Десятичная цифра (Nd)
ConnectingCharacter:
любой символ Unicode класса соединительной пунктуации (Pc)
FormattingCharacter:
любой символ Unicode класса формата (Cf)
Идентификаторы в одинарных кавычках
Один нестандартный идентификатор может содержать любую последовательность символов Юникода в качестве идентификатора, включая ключевые слова, пробелы, комментарии и операторы. Одинарные кавычки поддерживаются с escape-последовательностью из двух одинарных кавычек.
SingleQuotedIdentifier:
SingleQuotedIdentifierCharacters
SingleQuotedIdentifierCharacters:
SingleQuotedIdentifierCharacterSingleQuotedIdentifierCharactersopt
SingleQuotedIdentifierCharacter:
TextCharactersNoSingleQuote
SingleQuoteEscapeSequence
TextCharactersNoSingleQuote:
любой символ Юникода, кроме ' (U+0027)
SingleQuoteEscapeSequence:
'
'
Однозначный идентификатор
DisambiguatedIdentifier:
TableColumnIdentifier
GlobalIdentifier
TableColumnIdentifier:
Идентификатор[@
Идентификатор]
GlobalIdentifier:
[@
Идентификатор]
Ключевые слова контекста
ContextKeyword:
Parent
Self
ThisItem
ThisRecord
Учет регистра
Идентификаторы Power Apps зависят от регистра. Средство разработки автоматически изменит их на правильный регистр при написании формулы.
Разделители
DecimalSeparator:
.
(точка) для языков, в которых точка используется в качестве разделителя десятичных чисел, например 1.23
,
(запятая) для языков, в которых запятая используется в качестве разделителя для десятичных чисел, например 1,23
ListSeparator:
,
(запятая), если DecimalSeparator равен .
(dot)
;
(точка с запятой), если DecimalSeparator — ,
(запятая)
ChainingSeparator:
;
(точка с запятой), если DecimalSeparator — .
(точка)
;;
(двойная точка с запятой), если DecimalSeparator — ,
(запятая)
Операторы
Операторы используются в формулах для описания операций, включающих один или несколько операндов. Например, выражение a + b
использует оператор +
для добавления двух операндов a
и b
.
Оператор:
BinaryOperator
BinaryOperatorRequiresWhitespace
PrefixOperator
PrefixOperatorRequiresWhitespace
PostfixOperator
BinaryOperator:одно из
=
<
<=
>
>=
<>
+
-
*
/
^
&
&&
||
in
exactin
BinaryOperatorRequiresWhitespace:
And
Пробел
Or
Пробел
PrefixOperatorRequiresWhitespace:
Not
Пробел
Оператор ссылки
Ссылка на объект
Ссылка:
BaseReference
BaseReferenceReferenceOperatorReferenceList
BaseReference:
Идентификатор
DisambiguatedIdentifier
ContextKeyword
ReferenceList:
Идентификатор
ИдентификаторReferenceOperatorReferenceList
Встроенная запись
InlineRecord:
{
InlineRecordListopt}
InlineRecordList:
Идентификатор:
Выражение
Идентификатор:
ВыражениеListSeparatorInlineRecordList
Встроенная таблица
InlineTable:
[
InlineTableListopt]
InlineTableList:
Выражение
ВыражениеListSeparatorInlineTableList
Expression
Выражение:
Литерал
Ссылка
InlineRecord
InlineTable
FunctionCall
(
Выражение)
PrefixOperatorВыражение
ВыражениеPostfixOperator
ВыражениеBinaryOperatorВыражение
Связанные выражения
ChainedExpression:
Выражение
ВыражениеChainingSeparatorChainedExpressionopt
Вызов функции
FunctionCall:
FunctionIdentifier(
FunctionArgumentsopt)
FunctionIdentifier:
Идентификатор
Идентификатор.
FunctionIdentifier
FunctionArguments:
ChainedExpression
ChainedExpressionListSeparatorFunctionArguments
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по