Поделиться через


Грамматика выражений

Заметка

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 как состоящий из токена [@, за которым следует Идентификатор, за которым следует токен ].

При наличии более одного возможного расширения неконечного символа альтернативные варианты перечисляются в разных строках. Подстрочный индекс "необязательно" используется для указания необязательного символа. Например, следующее правило:

   Вызов функции:
     ИдентификаторФункции(АргументыФункциинеобязательный)

является сокращенным вариантом следующего:

   Вызов функции:
     ИдентификаторФункции()
     ИдентификаторФункции(АргументыФункции)

Альтернативные варианты обычно перечисляются в отдельных строках, но в тех случаях, когда существует много альтернатив, списку расширений, заданных в одной строке, может предшествовать фраза "один из". Это простое сокращение для перечисления всех альтернативных вариантов в отдельных строках.

Например, следующее правило:

   ДесятичнаяЦифра:один из
    0123456789

является сокращенным вариантом следующего:

   ДесятичнаяЦифра:
    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

Литералы

Литерал является представлением исходного кода значения.

   Буквально:
     ЛогическийЛитеральный
     ЧислоЛитерал
     ТекстовыйЛитерал

Логические литералы

Логический литерал используется для записи значений "истина" и "ложь" и создает логическое значение.

   ЛогическийЛитерал:один из
    truefalse

Числовые литералы

Числовой литерал используется для записи числового значения и дает числовое значение.

   ЧисловойЛитерал:
     ДесятичныеЦифрыЭкспоненциальнаяЧастьнеобязательный
     ДесятичныеЦифрыДесятичныйРазделительДесятичныеЦифрынеобязательныйЭкспоненциальнаяЧастьнеобязательный
     ДесятичныйРазделительДесятичныеЦифрыЭкспоненциальнаяЧастьнеобязательный

   ДесятичныеЦифры:
     ДесятичнаяЦифра
     ДесятичныеЦифрыДесятичнаяЦифра

   ДесятичнаяЦифра:один из
    0123456789

   ЭкспоненциальнаяЧасть:
     Индикатор степениЗнакнеобязательныйДесятичные цифры

   ExpentIndicator:один из
    eE

   Знак:один из
    +-

Текстовые литералы

Текстовый литерал используется для записи последовательности символов Юникода и создает текстовое значение. Текстовые литералы заключены в двойные кавычки. Чтобы включить двойные кавычки в текстовое значение, повторите двойные кавычки, как показано в следующем примере:

"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:один из
    =<<=>>=<>
    +-*/^
    &
    &&||
    inexactin

   ДвоичныйОператорТребуетПробелы:
     And Пробелы
     Or Пробелы

   ПрефиксОператор:
    !

   ПрефиксОператорТребуетсяПробел:
     Not Пробелы

   ПостфиксОператор:
    %

Оператор ссылки

   ReferenceOperator:один из
    .!

Ссылка на объект

   Ссылка:
     Базовая ссылка
     BaseReferenceReferenceOperatorReferenceList

   Базовая ссылка:
     Идентификатор
     РазрешенныйИдентификатор
     ContextKeyword

   Список литературы:
     Идентификатор
     ИдентификаторОператор ссылокСписок ссылок

Встроенная запись

   Встроенная запись:
     { InlineRecordListнеобязательный}

   InlineRecordList:
     Идентификатор:Выражение
     Идентификатор:ВыражениеListSeparatorInlineRecordList

Встроенная таблица

   Встроенная таблица:
     [ InlineTableListнеобходимо]

   ВстроенныйСписокТаблиц:
     Выражение
     ВыражениеРазделительСписковВстроенныйСписокТаблицы

Expression

   Выражение:
     Буквальный
     Ссылка
     InlineRecord
     ВстроеннаяТаблица
     ФункцияВызов
     ( Выражение)
     ПрефиксОператорВыражение
     ВыражениеПостфиксный оператор
     ВыражениеBinaryOperatorВыражение

Связанные выражения

   СвязанноеВыражение:
     Выражение
     ВыражениеРазделитель цепочкиВыражение цепочкинеобязательный

Вызов функции

   ФункцияВызов:
     ИдентификаторФункции(АргументыФункциинеобязательный)

   Идентификатор функции:
     Идентификатор
     Идентификатор.ИдентификаторФункции

   Аргументы функции:
     ChainedExpression
     ChainedExpressionРазделительСписковАргументыФункции