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


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

Заметка

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:один из
    0123456789

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

  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:одно из следующего
    truefalse

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

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

  NumberLiteral:
    DecimalDigitsExponentPartopt
    DecimalDigitsDecimalSeparatorDecimalDigitsoptExponentPartopt
    DecimalSeparatorDecimalDigitsExponentPartopt

  DecimalDigits:
    DecimalDigit
    DecimalDigitsDecimalDigit

  DecimalDigit:одно из
    0123456789

  ExponentPart:
    ExponentIndicatorSignoptDecimalDigits

  ExponentIndicator:одно из
    eE

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

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

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

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

  BinaryOperatorRequiresWhitespace:
    AndПробел
    OrПробел

  PrefixOperator:
    !

  PrefixOperatorRequiresWhitespace:
    NotПробел

  PostfixOperator:
    %

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

  ReferenceOperator:одно из
    .!

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

  Ссылка:
    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